2011-08-24 94 views
0

我有兴趣了解更多关于Lucene查询得分的更具体的信息。在他们的文档中,他们提到了VSM。我熟悉VSM,但它似乎与他们所允许的查询类型不一致。了解Lucene查询

我尝试通过BooleanScorer2和BooleanWeight的源代码,并没有真正有效。

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

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

+0

如果我问的话,请提供,但是有没有理由不接受RObert的答案?看起来他彻底解释了一切! – javanna

回答

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上开始更简单。我个人看它“自下而上”反正:

  • 一个查询产生的重量在整个指数有效:这个集成升压,IDF,queryNorm,甚至容易引起混淆,任何“外部”的提升/'父'像booleanquery这样的持有该术语的查询。这个重量是一次计算的。
  • Weight对于每个索引段创建一个Scorer(例如TermScorer),对于单个词条,此记分器具有它在公式中需要的所有内容,除了什么是依赖于文档的:文档内词条频率(TF)它必须读取帖子和文档的长度标准化值(标准)。所以这就是为什么termscorer将文档评分为weight * sqrt(tf)* norm。在实践中,这被缓存为tf值,以便对大多数文档进行评分是单一乘法。
  • 除了它的记分员负责nextDoc()'ing和advance()'subscorers之外,BooleanQuery确实没有做太多的事情,并且当布尔模型满足时,它结合了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/