rimen[天外孤客--jerry的blog]: 关于Lucence中的索引优化

来源:百度文库 编辑:神马文学网 时间:2024/04/30 00:19:13
关于Lucence中的索引优化
车东在他的文章中提到,通过提供IndexWriter的merge因子属性可以提供索引的速度.从原理入手,进行lucence代码的分析,然后通过测试数据进行实际应用中的优化.
先看下面的代码:
private final void maybeMergeSegments() throws IOException {
long targetMergeDocs = minMergeDocs;
while (targetMergeDocs <= maxMergeDocs) {
// find segments smaller than current target size
int minSegment = segmentInfos.size();
int mergeDocs = 0;
while (--minSegment >= 0) {
SegmentInfo si = segmentInfos.info(minSegment);
if (si.docCount >= targetMergeDocs)
break;
mergeDocs += si.docCount;
}
if (mergeDocs >= targetMergeDocs) // found a merge to do
mergeSegments(minSegment + 1);
else
break;
targetMergeDocs *= mergeFactor; // increase target size
}
}
一看就知道,当segmentInfos中的merge的文档数小于targetMergeDocs是,系统不会进行merge,而targetMergeDocs由minMergeDocs和mergeFactor决定.SegmentInfo 如果是单个索引的话,si.docCount为1,如果此时minMergeDocs为1,也就是targetMergeDocs为1,系统会进行merge,这样在效率上回大大降低.minMergeDocs>1的话,决定merge的大小还是minMergeDocs,targetMergeDocs *= mergeFactor无效,可以说mergeFactor只对批量索引有效,si.docCount>1的情况.
如果是批量索引,当si.docCount>minMergeDocs时,minMergeDocs和targetMergeDocs 决定了merge的数量.
在我的优化过程中,由于采用的是单一索引,所以我调整mergeFactor带来的性能上的差异不大,可以看成是系统带来的误差.而我改变minMergeDocs获得的性能可以从下面的数据看到:
以10000条记录为测试案例
minMergeDocs   对于运行的时间ms
default (10)    times=32707
20 times=21191
30 times=18476
40 times=16334
50 times=16744
100 times=13138
200 times=10125
400 times=10234
800 times=10015
1600 times=11256
3200 out of memory
从上面的数据来看,在100~200之间性能和存储比较优.当minMergeDocs 大到一定的程度,由于在内存调度上的问题,系统可能有更大量的访问IO.建议在定制lucence时,对与单一的索引可以把minMergeDocs 设成100左右以提供性能.而车东给出的说法并不完全.