在使用Lucene前,我们先大致熟悉下Lucene的几个核心类。
核心索引类:
public class IndexWriter
索引过程的中心组件,把它想象成一个可以对索引进行写操作的对象。
public abstract class Directry
Directory代表索引所在的位置,该抽象类有两个具体的子类实现。FSDirectory表示存储在文件系统的索引位置,RAMDirectory表示存储在内存中的索引位置。
public abstract class Analyzer
分词组件。在建立索引前首先要对文档进行分词,Lucene默认有一些分词类的实现,自己实现的分词要继承该类。
public final class Document
Document类似于数据库中的一条记录,它由好几个字段Field组成。
public final class Field
Field用来描述文档的某个属性,例如文章的标题,内容等等。
核心搜索类:
public class IndexSeacher
用来在已经建好的索引上进行搜索操作
public final class Term
搜索的基本单元。Term对象有两个域组成。Term term = new Term("fieldName","queryWord");
public abstract class Query
抽象类,有很多具体实现类。该类主要作用把用户输入的查询语句转换为Lucene能够是别的query。
public final class Hits(TopDocs)
Hits是用来保存查询得到的结果的。最新版的Lucene中,TopDocs已代替了Hits。
我们拿一张纸、一支笔,填写下面的表格:
序号
文件名
文件路径
文件类型
文件大小
修改时间
内容
……
填完以后,搜索的时候就可以照着这张纸“按图索骥”了。
在lucene中,这张纸叫做Directory(也就是索引保存的目录),这支笔叫做IndexWriter,表格中一条记录叫做Document,记录中的每项叫做Field。
下面我们来看第一个简单的Lucene实现索引的例子(Lucene版本为4.10.1)。
public class LuceneDemo {
public static void main(String[] args){
//RAMDirectory(内存路径)继承自Directory抽象类,另一个继承自该类的是FSDirectory(文件系统路径),Directory dir = FSDirectory.open(new File("此处写索引存储的位置,"));
Directory dir = new RAMDirectory();
//SimpleAnalyzer继承自抽象类Analyzer,是分词组件,不同语言有不同的分词组件包,也可以自己定义实现该抽象类
Analyzer analyzer = new SimpleAnalyzer();
//定义IndexWriterConfig
IndexWriterConfig iwc = new IndexWriterConfig(Version.LATEST, analyzer);
//定义document对象
Document doc = new Document();
try {
//第一步,切词入库,创建索引。定义IndexWriter对索引进行“写”操作
IndexWriter iw = new IndexWriter(dir, iwc);
//Field对象的构造方法有四个参数,前两个参数表示要建立索引的name和value,name指索引的名称,value指要建立索引的“文档对象”,例如博客的标题、正文
//Field.Store有YES和NO两个值,表示是否存储该Field
//Field.Index有5个不同的取值,ANALYZED,ANALYZED_NO_NORMS,NOT_ANALYZED,NOT_ANALYZED_NO_NORMS,NO,根据不同情况选择是否分词
doc.add(new Field("title", "james bonde", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("content","He want to go to school next year.",Field.Store.YES,Field.Index.ANALYZED));
doc.add(new Field("doc","He will go to his mother's home.",Field.Store.YES,Field.Index.ANALYZED));
iw.addDocument(doc);
iw.close();
//第二步,查询索引,返回结果
IndexReader ir = DirectoryReader.open(dir);
//定义IndexSearcher
IndexSearcher is = new IndexSearcher(ir);
//定义Term,new Term("doc", "home"),第一个值表示要搜索的域,第二个则表示搜索值
Term term = new Term("doc", "home");
//TermQuery继承自Query抽象类,是Lucene最基本的查询
Query query = new TermQuery(term);
//执行查询,返回TopDocs对象结果集
TopDocs td = is.search(query, 10);
for(int i=0;i<td.scoreDocs.length;i++){
Document d = is.doc(td.scoreDocs[i].doc);
System.out.println("----------"+d.getField("title"));
System.out.println("----------"+d.getField("content"));
System.out.println("----------"+d.getField("doc"));
}
dir.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}