Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。 已经有很多Java项目都使用了Lucene作为其后台的全文索引引擎,例如:Web论坛Jive,邮件列表HTML归档/浏览/查询系统Eyebrows,包括我们熟悉的Eclipse的全文帮助搜索功能。在实际开发中,因为数据库不是专为全文搜索设计的,所以对于全文搜索,特别是模糊查询类的全文搜索,用Lucene就比数据库的效率有优势的多。对于变化很少,但查询访问量大的数据,将数据库的数据以document形式存在本地,访问的时候不经过数据库,可以减少数据库压力。对于第一个Lucene程序,编写主要分以下几个步骤:
1.初始化Lucene的检索工具IndexSearcher
IndexSearcher是Lucene中最基本的检索工具,所有的检索都会用到IndexSearcher检索工具,但是在使用IndexSearcher之前,还要做一些准备工作,即对检索工具IndexSearcher进行初始化。
初始化IndexSearcher,需要设置索引存放的路径,这样才能让查询器定位索引,用于后面进行搜索。如以下为一个初始化IndexSearcher的过程:(4种方式)
public IndexSearcher(String path) throws IOException {
this(IndexReader.open(path), true);
}
public IndexSearcher(Directory directory) throws IOException {
this(IndexReader.open(directory), true);
}
public IndexSearcher(IndexReader r) {
this(r, false);
}
private IndexSearcher(IndexReader r, boolean closeReader) {
reader = r;
this.closeReader = closeReader;
}
如:Searcher searcher = new IndexSearcher(indexDir);
返回的结果是IndexSearcher类的一个实例,indexDir表示索引文件的存放路径。
2.构建索引器和索引函数
实例化一个构造器:
IndexWriter writer = new IndexWriter("D:/index/", new PanGuAnalyzer(), true); //索引的存储位置
这个函数有三个参数,分别是:path——索引文件存放路径,a——分词工具,create——true表示建立索引
3.建立索引
将要建立索引的文件构造成一个Document对象,并添加一个域,如:
Document doc = new Document();
doc.Add(new Field("id", item.id.ToString(), Field.Store.YES, Field.Index.UN_TOKENIZED));
这里先解释下三个概念:
1)Field:可以理解成索引文件中一个个的字段块,占用空间按字段长度分配。
2)Store:一个内部类,它是static的,主要为了设置Field的存储属性.
主要有以下几种:
public static final Store COMPRESS = new Store("COMPRESS"); // 在索引中压缩存储Field的值
public static final Store YES = new Store("YES");//在索引中存储Field的值
public static final Store NO = new Store("NO"); // 在索引中不存储Field的值
3.)Index: 通过Index设置索引方式,有以下几种:
public static final Index TOKENIZED = new Index("TOKENIZED"); // 对Field进行索引,同时还要对其进行分词(由Analyzer来管理如何分词)
public static final Index UN_TOKENIZED = new Index("UN_TOKENIZED"); // 对Field进行索引,但不对其进行分词
public static final Index NO_NORMS = new Index("NO_NORMS"); // 对Field进行索引,但是不使用Analyzer
4.优化检索,关闭写入
writer.Optimize(); //添加完所有document,我们对索引进行优化,优化主要是将多个索引文件合并到一个,有利于提高索引速度。
writer.Close();//随后将writer关闭,这点很重要。
5.开始检索