优化solr索引时如何限制合并段的数量?

How to limit the number of merged segments when optimising a solr index?

我有一个很大的 Solr 搜索索引,有很多段。我想合并它们以减少 space 在磁盘上的消耗,并通过扫描较小的索引来加快搜索速度,方法是在段合并期间从搜索中删除已删除的文档。

optimize 的默认行为是合并所有段,直到只剩下一个段。我想避免这种情况,并在剩下指定数量的段时提前停止。否则合并可能会因内存不足异常而失败,同时尝试合并两个大于可用 RAM 的块。

首先让我们看看磁盘上的索引段:

tomcat/solr/coreName/data/index$ ls -htlr --sort=size | grep .nvd

将输出按大小排序的索引段,因此您可以计算停止合并时应剩余多少段。合并总是首先从最小的块开始。

curl -X POST http://localhost:8080/solr/coreName/update -H "Content-Type: text/xml" --data-binary '<update> <optimize maxSegments="80"/> </update>'

将根据 solrConfig.xmlmergeFactor 中配置的 maxMergeAtOnce 中的 maxMergeAtOnce 将多个段合并为一个更大的结果的索引触发优化。

maxSegments 参数指定当合并应该停止时应该剩下多少段。因此,您可以在合并索引的最大块之前停止。

确保发送包含更新 XML <update> <optimize maxSegments="80"/> </update> 的 POST 正文,并用 maxSegments 参数集包装 optimize 命令。在 GET 请求中将参数作为查询参数发送将不起作用。

我还注意到我需要重新启动 Solr 来清理磁盘上的旧合并索引文件。在重新启动之前和成功合并之后,索引文件仍然存在于磁盘上。