了解Lucene查询

时间:2011-08-24 23:34:37

标签: search lucene

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

我尝试逐步执行BooleanScorer2和BooleanWeight的源代码,但没有真正有用。

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

另外,有没有办法简单地发送几个术语,只是得到这些术语的原始tf.idf分数,文档中描述的方式?

1 个答案:

答案 0 :(得分:4)

开始的地方是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上开始更简单。我个人认为它仍然是“自下而上”:

  • 一个Query在整个索引中创建一个有效的权重:这包含了boost,idf,queryNorm,甚至是令人困惑的任何“外部”/“父”查询的提升,比如持有该术语的booleanquery。这个重量只计算一次。
  • 权重为每个索引段创建一个记分器(例如TermScorer),对于单个术语,该记分员具有公式中所需的一切,除了依赖于文档的内容:文档内术语频率(TF),它必须从帖子中读取,并且文档的长度标准化值(标准)。所以这就是为什么termscorer将文档评分为weight * sqrt(tf)* norm。在实践中,这被缓存为tf值< 32这样得分大多数文件都是单一的。
  • 除了得分者负责nextDoc()'ing和advance()'子分类符之外, BooleanQuery确实不做“多”,当满足布尔模型时,它结合了子分数的分数,应用协调工厂(coord())基于匹配的子分数。

一般来说,它绝对难以追踪lucene如何评分文档,因为在所有发布的表单中,记分员负责两件事:匹配和计算分数。在Lucene的主干(http://svn.apache.org/repos/asf/lucene/dev/trunk/)中,它们现在是分开的,这样一种相似性基本上负责得分的所有方面,这是分开的从匹配。所以API可能更容易理解,也许更难,但至少你可以参考许多其他评分模型(BM25,语言模型,随机性差异,基于信息的模型)的实现,如果你感到困惑:{{3} }