将Lucene HitCollector(2.x)迁移到Collector(3.x)

将Lucene HitCollector(2.x)迁移到Collector(3.x),lucene,Lucene,在我们的一个项目中,我们使用一个旧的Lucene版本(2.3.2)。我现在正在查看当前的Lucene版本(3.5.0),并尝试重新编写旧代码。在旧项目中,我们扩展了TopFieldDocCollector以在collect()方法中执行一些额外的过滤。然而,我在理解新的收集器类时遇到了一些困难,我找不到一个好的例子 1) 方法setScorer()。如何/从何处获取记分器对象 2) 方法collect()。我想我需要创建自己的收藏并存储我感兴趣的文档,对吗 3) 当扩展TopDocsCollec

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

1) 方法setScorer()。如何/从何处获取记分器对象

2) 方法collect()。我想我需要创建自己的收藏并存储我感兴趣的文档,对吗

3) 当扩展TopDocsCollector时,我需要实现一个PriorityQueue以在构造函数中使用,对吗?它似乎没有标准的实现。但我仍然需要自己的集合来存储docid(或者更确切地说,ScoreDocs),并在搜索完成后调用populateResult

总的来说,扩展收集器似乎比扩展TopDocsCollector容易(很多),但也许我遗漏了一些东西

  • setScorer()是一个钩子,当IndexSearcher实际执行搜索时,它会传入记分器。因此,如果您关心分数,基本上可以覆盖此方法(例如,保存传入的记分器以便可以使用)。从其javadocs:

    在连续调用{@link#collect(int)}之前调用。启动位置 需要当前文档的分数(传递给 {@link#collect(int)}),应该保存传入的记分器并调用 score()在需要时

  • 为每个匹配文档调用collect(),并传入每段docid。注意:如果需要“重定基址的docid”(相对于所有读卡器段的整个读卡器),则必须覆盖setnextrader,保存docBase,并计算docBase+docid。从收集器javadocs:

    注意:传递给收款人的单据 方法是相对于当前读取器的。如果你的 收集器需要将其解析为 Multi*Reader,您必须通过记录 来自最近一次SetNextrader调用的docBase

  • TopDocsCollector是TopFieldCollector(按字段排序)和TopCoreDocCollector(按分数排序)的基类。如果您正在编写一个按分数排序的自定义收集器,那么扩展TopCoreDocCollector可能更容易

  • 另外:最简单的收集器示例是TotalHitCountCollector

    多谢各位。很高兴了解setScorer(),我不理解API文档,认为我必须自己创建记分器并传递它才能获得分数。