Lucene4.6中LogMergePolicy解析

a MergePolicy determines the sequence of primitive merge operations.

Whenever the segments in an index have been altered by IndexWriter, either the addition of a newly flushed segment, addition of many segments from addIndexes* calls, or a previous merge that may now need to cascade, IndexWriter invokes findMerges(org.apache.lucene.index.MergePolicy.MergeTrigger, org.apache.lucene.index.SegmentInfos) to give the MergePolicy a chance to pick merges that are now required. This method returns a MergePolicy.MergeSpecificationinstance describing the set of merges that should be done, or null if no merges are necessary. When IndexWriter.forceMerge is called, it callsfindForcedMerges(SegmentInfos,int,Map) and the MergePolicy should then return the necessary merges.

简单介绍见lucence cookbook,LogMergePolicy中的merge操作总是相邻的(adjacent),一般按merge factor(默认是10)合并,看看代码中findMerge(MergeTrigger,SegmentInfos)的实现,是从左到右扫描区间,从开始的那个level值直到剩余区间最大level值-0.75的level值对应的位置,然后间隔mergefactor个逐个合并.

findForcedMerge还指定一个maxNumSegments,默认会从后按一个MergeFactor,一个MergeFactor的添加OneMerge,但是如果不够一个mergefactor,但是又多于maxNumSegements个段就只会添加一个OneMerge,这个OneMerge合并maxNumSegments个段,是在保证segment较均衡(lopside)的情况下选取merge代价最低的那个连续段(该连续段字节总和小于起始位置之前那个段的字节总数的两倍,且代价最低,如果找不到满足的,则默认选取[0,maxNumSegments)这个段).

findForcedDeletesMergs(SegmentsInfos)较简单,区间从左往右扫描,从开始有删除的那个segment开始,最多连续mergefactor个段合并,再继续找有删除文档的segment,但似乎有个bug,当这样一个segment被找到,但下一个没有删除文档时,会把这两个加入一个OneMerge,感觉上效率比较低.

lucene4.6中默认的merge policy是TiesMergePolicy,与LogMergePolicy中不同在于不用相邻merge.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值