我正在运行许多SOLR文档更新,这导致成千上万的已删除文档以及磁盘使用率(100 Gb)显着增加。
我可以通过优化来删除所有已删除的文档
但这需要几个小时才能运行,并且需要大量的RAM和磁盘空间。
是否有更好的方法从SOLR索引中删除已删除的文档,或者在不创建已删除文档的情况下更新文档?
感谢您的帮助!
答案 0 :(得分:2)
Lucene使用仅追加策略,这意味着当添加旧版本的新版本时,旧文档被标记为已删除,并且新索引被插入索引中。这样,Lucene可以避免在添加文档时重写整个索引文件,但会以物理上仍存在于索引中的旧文档为代价-直到合并或优化发生为止。
发出expungeDeletes时,实际上是告诉Solr如果删除的文档数超过某个阈值,则执行合并,这意味着您将在Solr认为必要的情况下强制进行后台优化。
如何解决此问题取决于有关用例的更多具体信息-通常情况下,仅将其保留为合并因子等的标准设置就足够了。如果没有看到任何合并,则可能已禁用自动合并(具体取决于索引大小,并且看到成千上万个已删除文档似乎对于耗时2m30的索引处理来说很广泛)。在这种情况下,请确保正确启用它并再次调整其值。 that were introduced with 7.5 to the TieredMergePolicy也进行了更改,允许对合并过程进行更详细的控制(可能还有更好的默认设置)。
如果您每次都在重新索引整个数据集,则索引到一个单独的集合/核心,然后在删除旧数据集之前完成别名切换或重命名核心,这也是一种选择。