了解Apache Lucene的评分算法

特哈斯

我已经在Hibernate Search中工作了几个月,但仍然无法理解它带来的相关性。我总体上对它返回的结果感到满意,但是即使是最简单的测试也无法满足我的期望。

第一次测试使用的是频率(tf)。数据:

  • 单词
  • 单词单词
  • 单词单词
  • 词词词词
  • 单词单词单词单词
  • 单词单词单词单词单词

我得到的结果:

  1. 单词
  2. 词词词词
  3. 单词单词单词单词
  4. 单词单词单词单词单词
  5. 单词单词
  6. 单词单词

我真的对这种得分效果感到困惑。我的查询非常复杂,但是由于该测试没有涉及其他任何字段,因此可以将其简化如下:booleanjunction.should(phraseQuery).should(keywordQuery).should(fuzzyQuery)

我的分析仪如下:

 StandardFilterFactory
 LowerCaseFilterFactory
 StopFilterFactory
 SnowballPorterFilterFactory for english

我的解释对象https://jsfiddle.net/o51kh3og/

亚历克斯

计分计算确实很复杂。在这里,您必须从原始方程式开始

分数(q,d)=坐标(q,d)·queryNorm(q)·∑(tf(t in d)·idf(t)2·t.getBoost()·norm(t,d))

如您所说,tf这意味着项频率,其值是项频率的平方根。

但是在这里,正如您在解释中所看到的那样,您也有norm(aka fieldNorm)用于fieldWeight计算。让我们举个例子:

eklavya eklavya eklavya eklavya eklavya

4.296241 = fieldWeight in 177, product of:
  2.236068 = tf(freq=5.0), with freq of:
    5.0 = termFreq=5.0
  4.391628 = idf(docFreq=6, maxDocs=208)
  0.4375 = fieldNorm(doc=177)

埃克拉夫亚

4.391628 = fieldWeight in 170, product of:
  1.0 = tf(freq=1.0), with freq of:
    1.0 = termFreq=1.0
  4.391628 = idf(docFreq=6, maxDocs=208)
  1.0 = fieldNorm(doc=170)

在这里,eklavya比其他更好的成绩,因为fieldWeight是的产品tfidffieldNorm对于eklavya文档来说,最后一个更高,因为他只包含一个术语。

如上述文档所述:

lengthNorm-根据文档中该字段的标记数将文档添加到索引时计算的值,以便较短的字段对得分贡献更大。

您在一个字段中使用的术语越多,含义fieldNorm就越注意此字段

因此,总而言之,在这里您可以完美地理解分数不仅是根据频率来计算的,而且还取决于您所在领域的学期数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章