在我们的一个项目中,我们使用旧的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更容易,但也许我错过了一些东西。
答案 0 :(得分:4)
setScorer()是一个钩子,当它实际进行搜索时,ScoreSearcher会传入Scorer。因此,如果你完全关心得分,你基本上会覆盖这种方法(例如,将得分者的传球保存起来以便你可以使用它)。从它的javadocs:
在连续调用{@link #collect(int)}之前调用。实现 需要当前文件的分数(传入 {@link #collect(int)}),应该保存传入的Scorer并调用 在需要时获得scorer.score()。
为每个匹配的文档调用collect(),传入每段docid。请注意,如果您需要'rebased docid'(相对于其所有细分的整个读者),那么您必须覆盖setNextReader,保存docBase,并计算docBase + docid。来自Collector javadocs:
注意:传递给collect的文档 方法是相对于当前的读者。如果你的 收集器需要将其解析为docID空间 Multi * Reader,您必须通过录制来重新定位它 来自最近的setNextReader调用的docBase。
另外:最简单的收集器示例是TotalHitCountCollector!