【问题标题】:Understanding Lucene Queries了解 Lucene 查询
【发布时间】:2011-08-24 23:34:37
【问题描述】:

我有兴趣更具体地了解 Lucene 查询的评分方式。在他们的文档中,他们提到了 VSM。我对 VSM 很熟悉,但它似乎与它们允许的查询类型不一致。

我尝试单步调试 BooleanScorer2 和 BooleanWeight 的源代码,但无济于事。

我的问题是,有人可以逐步执行 BooleanScorer 来解释它如何组合查询。

另外,有没有一种方法可以简单地发送几个术语,并按照文档中描述的方式获取这些术语的原始 tf.idf 分数?

【问题讨论】:

  • 对不起,如果我问的话,但是有理由不接受 RObert 的回答吗?看来他把一切都解释得很透彻了!

标签: search lucene


【解决方案1】:

开始的地方是http://lucene.apache.org/java/3_3_0/api/core/org/apache/lucene/search/Similarity.html

我认为它消除了你的矛盾? Lucene 将信息检索的布尔模型 (BM) 与信息检索的向量空间模型 (VSM) 相结合 - BM“批准”的文档由 VSM 评分。

接下来要查看的是 Searcher.explain,它可以为您提供一个字符串,解释如何计算(查询、文档)对的分数。

我认为跟踪 BooleanScorer 的执行可能具有挑战性,首先理解 BooleanScorer2 可能最容易,它使用像 ConjunctionScorer/DisjunctionSumScorer 这样的子评分器,并将 BooleanScorer 视为一种优化。

如果这令人困惑,那么从更简单的 TermScorer 开始。无论如何,我个人认为它是“自下而上”的:

  • 一个查询创建一个在整个索引中有效的权重:这包含了 boost、idf、queryNorm,甚至令人困惑的是,任何“外部”/“父”查询(如持有该术语的 booleanquery)的提升。此权重仅计算一次。
  • 权重为每个索引段创建一个记分器(例如 TermScorer),对于单个术语,此记分器具有公式中所需的一切,除了依赖于文档的内容:文档内术语频率 (TF),它它必须从贴子中读取,以及文档的长度归一化值(norm)。这就是为什么 termscorer 将文档评分为 weight * sqrt(tf) * norm 的原因。实际上,这是为 tf 值
  • BooleanQuery 实际上并没有做“很多”,除了它的 scorers 负责 nextDoc()'ing 和 advance()'ing subscorers,当布尔模型满足时,它结合 subscorers 的分数,应用协调工厂(coord()) 基于匹配的子评分者数。

一般来说,很难追溯 lucene 如何对文档进行评分,因为在所有发布的表格中,评分者负责两件事:匹配和计算分数。在 Lucene 的主干 (http://svn.apache.org/repos/asf/lucene/dev/trunk/) 中,这些现在是分开的,因此相似性基本上负责评分的所有方面,这是分开的从匹配。所以那里的 API 可能更容易理解,也可能更难,但如果你感到困惑,至少你可以参考许多其他评分模型(BM25、语言模型、随机性发散、基于信息的模型)的实现:http://svn.apache.org/repos/asf/lucene/dev/branches/flexscoring/lucene/src/java/org/apache/lucene/search/similarities/

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 2011-08-13
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 2017-06-12
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多