首页 > 解决方案 > 为什么 TieredMergePolicy 比其他更好?

问题描述

我正在学习 ElasticSearch 和 Apache Lucene。

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

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

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

请帮我。

标签: elasticsearchlucene

解决方案


在这篇关于该主题的中文帖子TieredMergePolicy中,我发现了以下声明,它提供了一些关于over the的好处的见解,LogByteSizeMergePolicy这是 Lucene 之前的默认合并策略TieredMergePolicy

TieredMergePolicy和的区别在于LogByteSizeMergepolicy前者可以合并不相邻的段,区分一次允许合并setMaxMergeAtOnce(int v)的最大段数和一层允许的最大段数setSegmentsPerTier(double v)

要对TieredMergePolicy一个重要来源进行更广泛的解释,请参阅github 上针对该课程的评论。以下信息来自该来源,可在 Apache 2 许可下获得:

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

对于正常的合并,此策略首先计算允许在索引中包含多少段的“预算”。如果索引超出预算,则策略通过减小大小(按删除百分比按比例分配)对段进行排序,然后找到成本最低的合并。合并成本是通过合并的“倾斜”(最大段的大小除以最小段)、总合并大小和回收的删除百分比的组合来衡量的,因此具有较低倾斜、较小大小和回收更多删除的合并是青睐。

如果合并将产生大于“setMaxMergedSegmentMB”的段,则该策略将合并更少的段(如果该段有删除,则一次减少到 1 个)以将段大小保持在预算范围内。

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

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

注意从 Lucene 7.5 开始,有几处更改: + `findForcedMerges` 和 `findForcedDeletesMerges`)默认遵守最大段大小。+ 当 `findforcedmerges` 被调用时 `maxSegmentCount` 不是 1,结果索引不能保证有 <= `maxSegmentCount` 段。相反,它是在“尽力而为”的基础上进行的。具体来说,计算了理论上的理想段大小,并添加了 25% 的“软糖因子”作为新的“maxSegmentSize”,这是受到尊重的。+ `findForcedDeletesMerges` 不会产生大于 `maxSegmentSize` 的段。


推荐阅读