【问题标题】:How to limit the number of merged segments when optimising a solr index?优化solr索引时如何限制合并段的数量?
【发布时间】:2021-05-28 21:01:46
【问题描述】:
我有一个很大的 Solr 搜索索引,有很多段。我想合并它们以消耗更少的磁盘空间,并通过在段合并期间从搜索中删除已删除的文档来扫描较小的索引来加快搜索速度。
optimize 的默认行为是合并所有段,直到只剩下一个段。我想避免这种情况,并在剩余指定数量的段的情况下提前停止。否则,在尝试合并两个总和大于可用 RAM 的块时,合并可能会因内存不足异常而失败。
【问题讨论】:
标签:
optimization
indexing
solr
lucene
【解决方案1】:
首先让我们看一下磁盘上的索引段:
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.xml中mergeFactor中配置的maxMergeAtOnce将多个段合并成一个更大的结果触发索引优化。
maxSegments 参数指定在停止合并时应剩余多少段。因此,您可以在合并索引的最大块之前停止。
确保发送包含更新 XML <update> <optimize maxSegments="80"/> </update> 的 POST 正文,其中包含带有 maxSegments 参数集的 optimize 命令。在 GET 请求中将参数作为查询参数发送将不起作用。
我还注意到我需要重新启动 Solr 以清理磁盘上旧的合并索引文件。在重新启动之前和成功合并之后,索引文件仍然存在于磁盘上。