2012-03-26 90 views
2

在我们的一个项目中,我们使用旧的Lucene版本(2.3.2)。我现在正在研究当前的Lucene版本(3.5.0)并尝试重新编写旧代码。在旧项目中,我们扩展了TopFieldDocCollector以在collect()方法中执行一些额外的过滤。但是,我对理解新收集器类有点麻烦,但我找不到一个好例子。将Lucene HitCollector(2.x)迁移到收集器(3.x)

1)方法setScorer()。我如何/从哪里获得Scorer对象?

2)方法collect()。我想我需要创建自己的Collection并存储我感兴趣的docIds,对吗?

3)如果不是扩展TopDocsCollector,我需要实现一个PriorityQueue在构造函数中使用,正确吗?它似乎没有标准的实施。但是我仍然需要自己的Collection来存储docIds(或者说ScoreDocs),并且在搜索完成后调用populateResults?

总体而言,它似乎是延长收藏家是(很多)不是扩展TopDocsCollector更容易,但也许我失去了一些东西。

回答

4
  1. setScorer()是一个挂钩,当IndexSearcher实际进行搜索时,Scorer被传入。因此,如果您关心所有分数(例如,将传入的分数器保存起来,以便您可以使用它),则基本上可以覆盖此方法。从它的javadoc:

    连续调用之前调用{@link #collect(INT)}。实现 需要将当前文档的得分(传入到 {@link #collect(INT)}),必要时应该保存传入的得分手,叫 scorer.score()。

  2. 收集()被调用用于每个匹配文档,传入每个段的docID。请注意,如果您需要“重新分派的docid”(相对于其所有细分受众群中的整个读者),那么您必须重写setNextReader,保存docBase并计算docBase + docid。从收集的javadoc:

    注:传递给收集 方法的文档是相对于当前读者。如果您的 收集器需要将其解析为多读者的 的docID空间,则必须通过从最近的setNextReader调用中记录 docBase来重新设置它。

  3. TopDocsCollector是TopFieldCollector(按字段排序)和TopScoreDocCollector(按分数排序)的基类。如果您正在编写按分数排序的自定义收集器,则可能更容易扩展TopScoreDocCollector。

另外:最简单的收集器例子是TotalHitCountCollector!

+0

谢谢。很高兴知道setScorer(),我不理解API文档,并认为我必须自己创建Scorer并将其传入以获取分数。 – 2012-03-26 14:45:10

相关问题