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

标签 lucene

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

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

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

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

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

最佳答案

  1. setScorer() 是一个钩子(Hook),Scorer 是在 IndexSearcher 真正进行搜索时传入的。因此,如果您关心分数,您基本上可以重写此方法(例如,将传入的 Scorer 保存起来,以便您可以使用它)。来自其 javadocs:

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

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

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

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

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

关于lucene - 将 Lucene HitCollector (2.x) 迁移到 Collector (3.x),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9872933/

相关文章:

java - 解析查询时 Lucene token 流的开头和结尾是什么?

java - 向 Luke 添加自定义分析器

lucene - Azure 搜索 - 字段值结尾

c# - java lucene中lucene.net索引目录的使用

java - 如何在Hibernate Lucene Search中添加多个限制?

java - Lucene Apache 不保留我的旧索引

lucene - mg4j 与 apache lucene

java - 是否可以在 Solr 中创建一个多值多字段,以允许在查询时自定义逻辑?

solr - 如何获取solr中lucene索引的版本

Java Lucene - 对于相同 Lucene 查询语言,BooleanQuery 和 QueryParser 查询的不同结果