elasticsearch - 为什么 TieredMergePolicy 比其他更好?
问题描述
我正在学习 ElasticSearch 和 Apache Lucene。
最近,我发现 Apache Lucene 有一些合并策略,但 ElasticSearch 使用 TieredMergePolicy 而不是其他合并策略,例如 LogMergePolicy 和 LogByteSizeMergePolicy。
所以我一直在寻找有关 TieredMergePolicy 的信息。我找到了算法,但我不明白为什么 TieredMergePolicy 比其他算法更好(我的意思是一般情况,而不是特殊情况)
为什么在段合并时选择相似大小的段很重要,以及它如何影响整体性能?
请帮我。
解决方案
在这篇关于该主题的中文帖子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` 的段。
推荐阅读
- css - CSS媒体查询问题
- java - Java:Solidity solcJ-all 和 etheriumJ - 无法添加依赖项
- php - 多维数组 - 仅打印特定键值
- javascript - 如何在 PixelAdmin 模板中将 select2 依赖插件更新到版本 4.0.6
- struts2 - org.apache.tiles.definition.NoSuchDefinitionException:找不到名为“addCustomer.tiles”的定义
- python - 使用带有正则表达式分隔符的 read_csv 读取文本文件
- javascript - Javascript如何一次创建多个类的对象
- javascript - 从浏览器表单提交按钮重定向到应用程序反应本机
- c - 使用C的栈链表的pop()方法有错误
- java - 仅使用 OpenGL 上下文 ID (Java) 渲染到纹理