2012-12-06 49 views
5

我試圖更好地理解lucene如何對我的搜索進行評分,以便我可以對搜索配置或文檔內容進行必要的調整。solr/lucene idf分數

以下是評分細分的一部分。

的產品:

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個+日誌(numDocs /(docFreq + 1))

我檢查覈心管理控制檯,發現我的docFreq = maxDocs = 47667 。

使用lucene中的公式,我無法計算預期的7.880174。相反,我得到:idf = 3.988 = 1 + log(47667 /(48 + 1))。

在我的配方中是否存在某些我缺少的東西。

回答

6

我覺得你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選擇élog功能。詳情請參閱Java Math api