【问题标题】:Lucene custom scoring (Lucene 3.2) involves iterating through all documents in the index - fastest way?Lucene 自定义评分(Lucene 3.2)涉及遍历索引中的所有文档——最快的方式?
【发布时间】:2011-09-23 07:25:14
【问题描述】:

我正在尝试在 Lucene 中实现与 tf-idf 无关的自定义评分公式(例如,仅更改相似性是行不通的)。

为了做到这一点,我需要能够使用我的自定义查询并为存储在索引中的每个文档生成一个分数——不仅仅是那些与查询中的术语匹配的文档(因为我的评分涉及检查什么是本质上是同义词,因此即使文档没有确切的术语,它仍然可以产生积极的分数)。最好的方法是简单地创建一个 IndexReader 并为所有文档调用Document d = reader.doc(i)(如here 所述),然后当场生成分数?

我一直在查看 Lucene 的评分内部结构,特别是各种 Scorer 和 Collector 类,似乎发生的事情(对于 Lucene 3.2)是 Weight 提供了一个 Scorer,它与 Collector 一起循环遍历所有匹配的文档查询。我可以以某种方式利用这种结构,但再次获得一个自定义记分器实现来考虑所有文档吗?

【问题讨论】:

  • 我很好奇你想要实现什么样的评分。

标签: java lucene


【解决方案1】:

如果您决定采用自定义评分方案,正确的方法是使用 CustomScoreQuery 的子类并覆盖 getCustomScoreProvider 以返回您的 CustomScoreProvider 子类。 CustomScoreQuery 构造函数需要一个子查询。在这里,您将希望提供一个快速的原生 Lucene 查询,该查询将在进行自定义分数计算之前尽可能缩小结果集。您还可以安排在每个文档中存储任意数量的浮点值,并让您的自定义分数提供者可以访问这些值。对于每个这样的浮点值,您需要为CustomScoreQuery 的构造函数提供适当的ValueSourceQuery。请参阅这些类的 Javadocs,它们写得很好。不幸的是,我手头没有 Java sn-p。

【讨论】:

    【解决方案2】:

    使用IndexReader.termDocs,您可以遍历术语的发布列表,即包含该术语的所有文档。您可以使用它来提供您自己的 Lucene 顶部的查询处理,但是您将无法使用 QuerySimilarity 和其他任何东西。

    此外,如果您使用的是同义词 Lucene has some things in the contrib package。另一种可能的解决方案,不知道您是否尝试过,是通过Analyzer(或其他)将同义词注入文档中。这样即使文档没有查询词,您也可以返回它们。

    【讨论】:

      【解决方案3】:

      据我了解 Lucene,它将 (term, doc) 对存储在其索引中,因此查询实现为

      1. 获取包含查询词的文档,
      2. 对它们进行评分/排序。

      我从未实施过自己的评分,但我会先查看IndexReader.termDocs;它似乎实现了第 1 步。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 1970-01-01
        • 2013-12-30
        • 1970-01-01
        相关资源
        最近更新 更多