lucene-2.9.0
此版本使用的是对数合并策略
此前颁布的lucene是通过ducument的数量来驱动索引的合并的
使用策略为立即合并策略
例如合并因为mergeFactor
1.如果满足内存中的文档数为mergeFactor则触发内存索引写入磁盘
新增的segment文档数为mergeFactor
2.初始合并数为mergeDocs = mergeFactor
3.如果磁盘中有mergeFactor个segment, 每个segment有mergeDocs个文档数,
触发合并为mergeFactor*mergeDocs新segment
5.更新mergeDocs = mergeFactor*mergeDocs,如果满足条件3,递归合并直至无
可合并为止
6.调用optimize会将索引索引合并,此时不许满足mergeFactor条件
lucene-2.9.0 是使用内存驱动触发过程
意思是,设定内存索引大小(IndexWriter::DEFAULT_RAM_BUFFER_SIZE_MB),
当预定内存耗尽则
1. 触发内存索引写入磁盘
2. 触发可能的合并过程
3. 合并策略为对数
索引合并过程
合并过程是由独立一个线程完成
IndexWriter.addDocument(Document) line: 2428
IndexWriter.addDocument(Document, Analyzer) line: 2475
IndexWriter.flush(boolean, boolean, boolean) line: 4167
IndexWriter.maybeMerge() line: 2990
IndexWriter.maybeMerge(boolean) line: 2994
IndexWriter.maybeMerge(int, boolean) line: 2998
IndexWriter.updatePendingMerges(int, boolean) line: 3028
LogByteSizeMergePolicy(LogMergePolicy).findMerges(SegmentInfos) line: 444
// 有需要合并的集合
if (spec != null) {
final int numMerges = spec.merges.size();
for(int i=0;i<numMerges;i++)
registerMerge((MergePolicy.OneMerge) spec.merges.get(i));
}
另外一个进程依旧索引文档,而一个进程在