为什么 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` 的段。
我正在学习 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
andLogByteSizeMergepolicy
is that the former can merge non-adjacent segments, and distinguish the maximum number of segments allowed to merge at one timesetMaxMergeAtOnce(int v)
and the maximum number of segments allowed in a layersetSegmentsPerTier(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` 的段。