我正在尝试在 Lucene 中实现一个与 tf-idf 无关的自定义评分公式(例如,仅更改相似性是行不通的)。
为了做到这一点,我需要能够使用我的自定义查询并为存储在索引中的每个文档生成一个分数——而不仅仅是那些与查询中的术语匹配的文档(因为我的评分涉及检查哪些是本质上是同义词,所以即使文档没有确切的术语,它仍然可以产生积极的分数)。最好的方法是简单地创建一个 IndexReader 并为所有文档调用 Document d = reader.doc(i)
(如 here 所述),然后当场生成一个分数吗?
我一直在查看 Lucene 的评分内部结构,特别是各种 Scorer 和 Collector 类,看起来(对于 Lucene 3.2)发生的事情是一个 Weight 提供了一个 Scorer,它与 Collector 一起循环遍历所有匹配的文档查询。我能否以某种方式利用此结构,但再次获得自定义 Scorer 实现来考虑所有文档?
最佳答案
如果您决定采用自定义评分方案,正确的方法是使用 CustomScoreQuery
的子类并覆盖 getCustomScoreProvider
以返回您的 CustomScoreProvider 子类
。 CustomScoreQuery
构造函数需要一个子查询。在这里,您将希望提供一个快速的 native Lucene 查询,该查询将在通过您的自定义分数计算之前尽可能缩小结果集。您还可以安排在每个文档中存储任意数量的浮点值,并让您的自定义乐谱提供程序可以访问这些值。您需要为每个此类浮点值向 CustomScoreQuery
的构造函数提供适当的 ValueSourceQuery
。请参阅有关这些类的 Javadocs,它们写得很好。不幸的是,我手头没有 Java 片段。
关于java - Lucene 自定义评分(Lucene 3.2)涉及遍历索引中的所有文档 - 最快的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6489864/