将Lucene HitCollector(2.x)迁移到收集器(3.x)

时间:2012-03-26 13:21:51

标签: lucene

在我们的一个项目中,我们使用旧的Lucene版本(2.3.2)。我现在正在查看当前的Lucene版本(3.5.0)并尝试重新编写旧代码。在旧项目中,我们扩展了TopFieldDocCollector以在collect()方法中进行一些额外的过滤。然而,我在理解新的Collector类时遇到了一些麻烦,我找不到一个好的例子。

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

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

3)当扩展TopDocsCollector时,我需要在构造函数中实现PriorityQueue,对吗?似乎没有标准的实施方案。但是我仍然需要自己的Collection来存储docIds(或者更确切地说,ScoreDocs),并在搜索结束后调用populateResults?

总的来说,扩展收集器似乎比扩展TopDocsCollector更容易,但也许我错过了一些东西。

1 个答案:

答案 0 :(得分:4)

  1. setScorer()是一个钩子,当它实际进行搜索时,ScoreSearcher会传入Scorer。因此,如果你完全关心得分,你基本上会覆盖这种方法(例如,将得分者的传球保存起来以便你可以使用它)。从它的javadocs:

    在连续调用{@link #collect(int)}之前调用。实现 需要当前文件的分数(传入 {@link #collect(int)}),应该保存传入的Scorer并调用 在需要时获得scorer.score()。

  2. 为每个匹配的文档调用collect(),传入每段docid。请注意,如果您需要'rebased docid'(相对于其所有细分的整个读者),那么您必须覆盖setNextReader,保存docBase,并计算docBase + docid。来自Collector javadocs:

    注意:传递给collect的文档  方法是相对于当前的读者。如果你的  收集器需要将其解析为docID空间  Multi * Reader,您必须通过录制来重新定位它  来自最近的setNextReader调用的docBase。

  3. TopDocsCollector是TopFieldCollector(按字段排序)和TopScoreDocCollector(按分数排序)的基类。如果您正在编写一个按分数排序的自定义收集器,那么可能更容易扩展TopScoreDocCollector。
  4. 另外:最简单的收集器示例是TotalHitCountCollector!