名词解释:
Document:逻辑文件,Lucene只能识别并处理该类型的文件。
Field:用来标识当前的数据源的各种属性。它所具有的存储特性包括Store、Index
Store包括三个常量:COMPASS(Field被压缩存储),YES(Field被存储),NO(Field不被存储)
Index包括四个常量:NO(Field不索引),TOKENIZED(Field被分词后索引),UN_TOKENIZED(Field不分词索引),NO_NORMS(不实用Analyzer来索引Field)
IndexWriter:创建索引,合并各种索引段,以及控制与索引相关的各方面。
倒排:一种面向单词的索引机制,通常是由词(关键字)和出现情况两部分组成。对于索引中的每个词(关键字),都跟随一个列表(位置表),用来记录单词在所有文档中出现的位置。
mergeFactor:决定segment该如何被addDocument()方法进行合并。当取比较小的值时,索引时所使用的内存较少,而且搜索未优化的索引的速度会很快,但是索引建立的速度会比较慢。当取较大值时,建立索引时需要使用更多的内存,并且查找未优化的索引时速度会慢些,不过索引建立时的速度会比较快,因此,取值较大适合批量的索引建立,取值较小适合间歇性的向索引添加文档。
maxMergeDocs:限制segment的文档数量。
minMergeDocs(maxBufferedDocs):限制内存中的文档数量。
IndexWriter中的optimize()用来优化segment,将所有的segment合并为一个完整的segment。
索引的合并与索引的优化:
在创建索引的过程中,IndexWriter的构造函数如下:
public IndexWriter(Directory d, Analyzer a, boolean create);
其中Directory是抽象类型,包含两个子类,分别为RAMDirectory和FSDirectory。
合并的具体示例如下:
/*
* 合并索引
*/
public class UniteIndex {
public void uniteTest() throws Exception {
// 初始化一个RAMDirectory对象
RAMDirectory ram = new RAMDirectory();
// 初始化一个FSDirectory对象
FSDirectory fs = FSDirectory.getDirectory("d:\\uniteindex", true);
// 构建一个索引器,并以文件系统的目录作为其目标路径
IndexWriter fsWriter = new IndexWriter(fs, new StandardAnalyzer(), true);
// 构建一个索引器,并以内存作为其目标路径
IndexWriter ramWriter = new IndexWriter(ram, new StandardAnalyzer(), true);
// 创建第一个文档
Document d1 = new Document();
Field f1 = new Field("book", "平凡的世界", Field.Store.YES, Field.Index.TOKENIZED);
d1.add(f1);
// 创建第二个文档
Document d2 = new Document();
Field f2 = new Field("book", "基督山伯爵", Field.Store.YES, Field.Index.TOKENIZED);
d2.add(f2);
fsWriter.addDocument(d1);
ramWriter.addDocument(d2);
// 关闭内存索引器
ramWriter.close();
// 合并索引
fsWriter.addIndexes(new Directory[]{ram});
// 关闭磁盘索引器
fsWriter.close();
}
public static void main(String[] args) throws Exception {
new UniteIndex().uniteTest();
}
}