【问题标题】:solr / lucene idf scoresolr / lucene idf 分数
【发布时间】:2012-11-25 00:01:03
【问题描述】:

我正在尝试更好地了解 lucene 如何对我的搜索进行评分,以便我可以对我的搜索配置或文档内容进行必要的调整。

以下是分数细分的一部分。

产品:

    0.34472802 = queryWeight, product of:
        2.2 = boost
        7.880174 = idf(docFreq=48, maxDocs=47667)
        0.019884655 = queryNorm
      1.9700435 = fieldWeight in 14363, product of:
        1.0 = tf(freq=1.0), with freq of:
          1.0 = termFreq=1.0
        7.880174 = idf(docFreq=48, maxDocs=47667)
        0.25 = fieldNorm(doc=14363)
0.26806915 = (MATCH) max of:
  0.07832639 = (MATCH) weight(shortDescription:tires^1.1 in 14363) [DefaultSimilarity], result of:
    0.07832639 = score(doc=14363,freq=1.0 = termFreq=1.0

我了解提升的计算方式,因为这是我的配置值

但是 idf 是如何计算的(7.880174 = idf 值)。

根据lucene,idf公式为:idf(t) = 1 + log(numDocs/(docFreq+1))

我检查了核心管理控制台,发现我的 docFreq = maxDocs = 47667。

使用来自 lucene 的公式,我无法计算出预期的 7.880174。相反,我得到:idf = 3.988 = 1 + log(47667/(48+1))。

我的公式中是否缺少某些内容。

【问题讨论】:

    标签: solr lucene scoring


    【解决方案1】:

    我认为你的 log 函数选择 10 作为基础,而在 lucene 中我们选择 e 作为基础。

    log(47667/(48+1), 10) = 2.9880217397306
    log(47667/(48+1), e) = 6.8801743154459
    

    lucene的idf方法源码为:

      public float idf(int docFreq, int numDocs) {
        return (float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0);
      }
    

    如您所见,idf 使用 Java Math.log 计算 idfMath.log 选择 e 作为 log 函数。详情请见Java Math api

    【讨论】:

      【解决方案2】:

      Lucene 网站好像有错字。

      http://lucene.apache.org/core/3_6_0/api/core/org/apache/lucene/search/Similarity.html

      状态 1 + log(numDocs/(docFreq+1))

      但实际上是 1 + ln(numDocs/(docFreq+1))

      【讨论】:

        猜你喜欢
        • 2016-08-24
        • 2017-03-07
        • 2011-04-04
        • 2011-03-03
        • 2011-04-28
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        • 1970-01-01
        相关资源
        最近更新 更多