Lucene随笔-LogMergePolicy

lucene版本:6.5.4

当IW索引中的数据发生任何变化时,都会触发merge检测,即找出可以合并的merge的segment集合;并且判断是否需要合并,如果需要合并则返回一组OneMerge,一个OneMerge对应的时一个Segment。**那么如何取获取那些需要合并的段集合呢?**这就是我们本节所要讲的。在Lucene4版本前,其默认的MergePolicy为LogMergePolicy;在此之后变为TieredMergePolicy。本节首先介绍一个LogMergePlolicy。

LogMergePlolicy首先来说时一个抽象类,主要包含了一些默认参数以及基本的函数;其子类主要包含了两个:LogDocMergePolicy与LogByteSizeMergePolicy。这两种规则的侧重点不同:分别为段内文档的数量与段的大小。

合并的相关参数

public static final double LEVEL_LOG_SPAN = 0.75;

Defines the allowed range of log(size) for each level. A level is computed by taking the max segment log size, minus LEVEL_LOG_SPAN, and finding all segments falling within that range

定义了每一个level的范围。

public static final int DEFAULT_MERGE_FACTOR = 10

定义了执行一次merge包含了多少个segnment的默认值。

 public static final int DEFAULT_MAX_MERGE_DOCS = Integer.MAX_VALUE;

如果段的文档数量超过这个值的时后,将不会再被merge(在LogDocMergePolicy里面默认为是1000),这个是默认值。

public static final double DEFAULT_NO_CFS_RATIO = 0.1;

默认值为0.1,如果我们的索引文件设置为复合文件(compound file ),那么.doc、.pos、.fdx等等索引文件在执行段合并后会生成一个复合文件,这个文件可能会很大,所以在合并前会判断将要生成的复合文件的大小是否会超过总的索引文件的10%,如果超过,那么合并后就不会生成复合文件。

protected long minMergeSize

seg最小不能小于这个值,如果小于则取整;为了保证那些超级小的段也能够被合并。在LogByteSizeMergePolicy中默认为1.6MB。

protected long maxMergeSize;

如果seg的大小大于这个值将永远不会被合并。在LogByteSizeMergePolicy中默认为2048MB.

protected boolean calibrateSizeByDeletes = true;

该值描述了是否要标记段中的被删除的文档,如果该值为true,那么被删除的文档的个数或大小不会作为该段的一部分。

Segment的量度

对于LogMergePolicy,lucene有两种实现:LogDocMergePolicy与LogByteSizeMergePolicy

LogDocMergePolicy-文档数量:一个段中的文档数量可以用来描述段的大小,根据calibrateSizeByDeletes的值判断被删除的文档号是否也作为段的大小的一部分,例如LogDocMergePolicy就使用了该方法来计算段的大小
LogByteSizeMergePolicy-索引文件大小:一个段中包含的所有的索引文件大小总和,在Lucene7.5.0版本中除了LogDocMergePolicy,其他的合并策略都使用该方法

流程

触发条件

任何对文档的修改都会触发合并策略。

1. 计算Log值
我的理解是为了进行平滑,如果最小值和最大值相差过大,将可能一直无法满足合并的要求。

log(SegmentSize) / (mergeFactor)

2. 分层
首先获取未处理段集的maxLevel,即上述的值。然后获取levelBottom = maxLevel - LEVEL_LOG_SPAN。则边界就为[maxLevel最右边的边界, maxLevel左边第一个达到levelBottom的seg]。

3. 生成OneMerge

  • 如果当前层内段集数量大于mergeFactor则进行遍历,判断该level内的段是否满足需求(比如段是否超过maxSize)。
    4. 执行合并
    IW开启后台线程进行合并。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值