use*_*532 5 lucene solr scoring
我正在努力更好地理解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
Run Code Online (Sandbox Code Playgroud)
我理解如何计算提升,因为这是我的配置值
但是如何计算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)).
我的配方中是否有一些我遗漏的东西.
我认为你的log函数选择10作为基础,而在lucene中我们选择e作为基础.
log(47667/(48+1), 10) = 2.9880217397306
log(47667/(48+1), e) = 6.8801743154459
Run Code Online (Sandbox Code Playgroud)
idflucene方法的源代码是:
public float idf(int docFreq, int numDocs) {
return (float)(Math.log(numDocs/(double)(docFreq+1)) + 1.0);
}
Run Code Online (Sandbox Code Playgroud)
如您所见,idf使用Java Math.log计算,idf同时Math.log选择e作为log函数.有关详细信息,请参阅Java Math api.
看起来 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))