【问题标题】:Understanding Apache Lucene's scoring algorithm了解 Apache Lucene 的评分算法
【发布时间】:2015-09-02 07:30:25
【问题描述】:

我已经使用 Hibernate Search 几个月了,但我仍然无法消化它带来的相关性。我对它返回的结果总体上很满意,但即使是最简单的测试也不能满足我的期望。

第一个测试使用术语频率(tf)。 数据:

  • 字字
  • 字字字
  • 字字字字
  • 字字字字字
  • 字字字字字字

我得到的结果:

  1. 字字字字
  2. 字字字字字
  3. 字字字字字字字
  4. 字字
  5. 字字字

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

我的分析器如下:

 StandardFilterFactory
 LowerCaseFilterFactory
 StopFilterFactory
 SnowballPorterFilterFactory for english

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

【问题讨论】:

    标签: search solr lucene full-text-search hibernate-search


    【解决方案1】:

    评分计算非常复杂。在这里,你必须以the primal equation开头:

    score(q,d) = coord(q,d) · queryNorm(q) · ∑ ( tf(t in d) · idf(t)2 · t.getBoost() · norm(t,d))

    正如你所说,你有tf,表示词频,它的值是词频的平方根。

    但是在这里,正如您在your explanation 中看到的那样,您还拥有norm(又名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 比另一个得分更高,因为fieldWeighttfidffieldNorm 的乘积。 eklavya 文档的最后一个更高,因为他只包含一个词。

    如上文档所说:

    lengthNorm - 当文档被添加到索引时计算 根据文档中该字段的token数量,所以 较短的字段对分数的贡献更大。

    字段中的术语越多,fieldNorm 就越低。 小心value of this field

    因此,总而言之,在这里您可以完美地理解分数不仅根据频率计算,而且还根据您所在领域的术语数计算。

    【讨论】:

    • 完美!我错过了 fieldNorm 的重点。我认为这是一些规范化因素,并根据其他文档的分数动态得出。现在我明白它是基于字段长度的。谢谢!
    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2010-09-05
    相关资源
    最近更新 更多