0

我想很好地理解 Solr 合并行为。我对不同的合并策略做了一些研究。而且似乎 TieredMergePolicy 比旧的合并策略(LogByteSizeMergePolicy 等)更好。这就是我使用这个的原因,这是最后一个 solr 版本的默认策略。

首先,我给你一些我读过的有趣的链接,以便更好地了解合并过程:http: //java.dzone.com/news/merge-policy-internals-solr http://blog.mikemccandless.com /2011/02/visualizing-lucenes-segment-merges.html

根据Lucene的官方文档,我想问几个问题: http: //lucene.apache.org/core/3_2_0/api/all/org/apache/lucene/index/TieredMergePolicy.html

问题

1- 在官方文档中,有一种方法叫做 setExpungeDeletesPctAllowed(double v)。而在 Solr 4.3.0 中,我检查了 TieredMergePolicy 类,我没有找到这个方法。还有另一种看起来像这样的方法,称为:setForceMergeDeletesPctAllowed(double v)。两种方法之间有什么区别吗?

2- 仅当您执行 ExpungeDelete 和优化时才调用上述两种方法,还是在正常合并时调用它们。

3-我读过,分段之间的合并是根据分段上已删除文档百分比的按比例完成的。默认情况下,此百分比设置为 10%。是否可以将此值设置为 0% 以确保合并后索引中不再有已删除的文档?

如果可能的话,我需要在不调用 optimize() 方法的情况下减小索引的大小。这就是为什么有关合并过程的任何信息对我来说都很有趣的原因。

谢谢

4

1 回答 1

3

您似乎在混淆您的文档。如果您使用的是 Lucene 4.3.0,请使用它的文档(请参阅TieredMergePolicy4.3.0 中的正确文档),而不是 3.2.0 版本。

无论如何,关于这些特定问题:参见#Lucene-3577

1 - 出于所有意图和目的,似乎主要是必要的名称更改。

2 - 首先,IndexWriter.expungeDeletes在 4.3.0 中不再存在。如果必须,您可以使用IndexWriter.forceMergeDeletes(),但强烈建议不要使用它,因为它非常非常昂贵。我相信这只会影响ForceMergeDeletes()通话。如果您希望回收删除,请在 MergePolicy 中设置它,使用: TieredMergePolicy.setReclaimDeletesWeight

3 - 允许的百分比就在您在第一个问题中指出的方法调用中。但是,在调用时强制合并所有删除ForceMergeDeletes()将有助于使已经非常昂贵的操作变得更加昂贵。

只是冒险猜测一下,如果您需要节省索引占用的磁盘空间,您可能会更仔细地查看索引中存储了多少数据。当然,没有足够的信息可以肯定地说,但似乎是一个值得考虑的解决方案。

于 2013-08-21T20:37:41.790 回答