为什么 TieredMergePolicy 比其他的好?

Why is TieredMergePolicy is better than others?

我正在学习 ElasticSearch 和 Apache Lucene。

最近,我发现 Apache Lucene 有一些合并策略,但 ElasticSearch 使用 TieredMergePolicy 而不是其他合并策略,如 LogMergePolicy 和 LogByteSizeMergePolicy。

所以我一直在搜索有关 TieredMergePolicy 的信息。我找到了算法,但我不明白为什么 TieredMergePolicy 比其他算法更好(我的意思是一般情况下,不是特殊情况)

为什么在段合并时选择相似大小的段很重要,它如何影响整体性能?

请帮助我。

TieredMergePolicy 首先计算索引中应包含多少段的允许“预算”,方法是计算“完美对数阶梯”在给定总索引大小、最小段大小(floored)、mergeAtOnce、以及一个新的配置 maxSegmentsPerTier,它允许您设置楼梯中每个楼梯的允许宽度(段数)。这很好,因为它将一次合并的段数与楼梯的宽度分离开来。

在这个关于主题的 Chinese post 中,我发现了以下陈述,它提供了一些关于 TieredMergePolicy 相对于 LogByteSizeMergePolicy 的好处的见解,LogByteSizeMergePolicy 是 Lucene 在 [ 之前的默认合并策略=10=]:

The difference between TieredMergePolicy and LogByteSizeMergepolicy is that the former can merge non-adjacent segments, and distinguish the maximum number of segments allowed to merge at one time setMaxMergeAtOnce(int v) and the maximum number of segments allowed in a layer setSegmentsPerTier(double v).

对于 TieredMergePolicy 的更广泛的解释,一个很好的来源是 github 对 class 的评论。以下信息来自该来源并在 Apache 2 许可下可用:

合并大小大致相等的段,以每层允许的段数为准。 这类似于 LogByteSizeMergePolicy,除了这个合并策略能够合并 不相邻的段,并将一次合并的段数 (setMaxMergeAtOnce) 与每层允许的段数 (setSegmentsPerTier) 分开。 此合并策略也不会过度合并(即级联合并)。

对于正常合并,此策略首先计算 "budget" 允许合并的段数 在索引中。如果索引超出预算,则策略按大小递减对段进行排序 (按删除百分比进行评级),然后找到成本最低的合并。合并成本由 合并的 "skew" 的组合(最大段的大小除以最小段), 总合并大小和回收的删除百分比,以便合并具有更低的倾斜度、更小的大小和 那些回收更多删除的人受到青睐。

如果合并将产生大于 `setMaxMergedSegmentMB` 的段,则 策略将合并更少的段(如果有删除,一次减少到 1 个)以保持 细分市场规模低于预算。

注意:此策略自由合并不相邻的段;如果这是一个问题,请使用 `LogMergePolicy`。

注意:此策略始终按段的字节大小合并,始终按比例分配 删除百分比

注意 从 Lucene 7.5 开始,有几个变化: + `findForcedMerges` 和 `findForcedDeletesMerges`) 默认遵守最大段大小。 + 当调用 `findforcedmerges` 的 `maxSegmentCount` 不是 1 时,结果索引为 不保证有 <= `maxSegmentCount` 段。相反,它是基于 "best effort" 的。 具体来说,计算出理论上的理想段大小,并且 "fudge factor" 为 25% 添加为新的“maxSegmentSize”,这是受尊重的。 + `findForcedDeletesMerges` 不会产生大于 `maxSegmentSize` 的段。