Lucene学习(二)之索引的合并

名词解释:

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();
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值