更新SOLR文档而不添加已删除的文档

时间:2018-11-10 20:07:58

标签: solr

我正在运行许多SOLR文档更新,这导致成千上万的已删除文档以及磁盘使用率(100 Gb)显着增加。

我可以通过优化来删除所有已删除的文档

  

卷曲http://localhost:8983/solr/core_name/update?optimize=true

但这需要几个小时才能运行,并且需要大量的RAM和磁盘空间。

是否有更好的方法从SOLR索引中删除已删除的文档,或者在不创建已删除文档的情况下更新文档?

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

Lucene使用仅追加策略,这意味着当添加旧版本的新版本时,旧文档被标记为已删除,并且新索引被插入索引中。这样,Lucene可以避免在添加文档时重写整个索引文件,但会以物理上仍存在于索引中的旧文档为代价-直到合并或优化发生为止。

发出expungeDeletes时,实际上是告诉Solr如果删除的文档数超过某个阈值,则执行合并,这意味着您将在Solr认为必要的情况下强制进行后台优化。

如何解决此问题取决于有关用例的更多具体信息-通常情况下,仅将其保留为合并因子等的标准设置就足够了。如果没有看到任何合并,则可能已禁用自动合并(具体取决于索引大小,并且看到成千上万个已删除文档似乎对于耗时2m30的索引处理来说很广泛)。在这种情况下,请确保正确启用它并再次调整其值。 that were introduced with 7.5 to the TieredMergePolicy也进行了更改,允许对合并过程进行更详细的控制(可能还有更好的默认设置)。

如果您每次都在重新索引整个数据集,则索引到一个单独的集合/核心,然后在删除旧数据集之前完成别名切换或重命名核心,这也是一种选择。