通過searcher.explain(query query, int doc)方法可以檢視某個文件的得分的具體構成。
在lucene中score簡單說是由 tf * idf * boost * lengthnorm計算得出的。
tf:是查詢的詞在文件中出現的次數的平方根
idf:表示反轉文件頻率,觀察了一下所有的文件都一樣,所以那就沒什麼用處,不會起什麼決定作用。
boost:激勵因子,可以通過setboost方法設定,需要說明的通過field和doc都可以設定,所設定的值會同時起作用
lengthnorm:是由搜尋的field的長度決定了,越長文件的分值越低。
所以我們程式設計能夠控制score的就是設定boost值。
還有個問題,為什麼一次查詢後最大的分值總是1.0呢?
因為lucene會把計算後,最大分值超過1.0的分值作為分母,其他的文件的分值都除以這個最大值,計算出最終的得分。
下面用**和執行結果來進行說明:
public class scoresorttest
}}
[b]執行結果:[/b]
[quote]bc bc 0.629606
0.629606 = (match) fieldweight(bookname:bc in 0), product of:
1.4142135 = tf(termfreq(bookname:bc)=2)
0.71231794 = idf(docfreq=3, numdocs=3)
0.625 = fieldnorm(field=bookname, doc=0)
ab bc 0.4451987
0.4451987 = (match) fieldweight(bookname:bc in 1), product of:
1.0 = tf(termfreq(bookname:bc)=1)
0.71231794 = idf(docfreq=3, numdocs=3)
0.625 = fieldnorm(field=bookname, doc=1)
ab bc cd 0.35615897
0.35615897 = (match) fieldweight(bookname:bc in 2), product of:
1.0 = tf(termfreq(bookname:bc)=1)
0.71231794 = idf(docfreq=3, numdocs=3)
0.5 = fieldnorm(field=bookname, doc=2)
[/quote]
從結果中我們可以看到:
bc bc文件中bc出現了2次,tf為2的平方根,所以是1.4142135。而其他的兩個文件出現了一次,所以是1.0
所有的三個文件的idf值都是一樣的,是0.71231794
預設情況下,boost的值都是1.0,所以lengthnorm就是當前的fieldnorm的值。前兩個文件的長度一致,為0.625,而排在最後的文件,因為長度要長一些,所以分值要低,為0.5
現在對f2這個字段增加激勵因子:f2.setboost(2.0f);
執行結果變為:
[quote]ab bc 0.8903974
0.8903974 = (match) fieldweight(bookname:bc in 1), product of:
1.0 = tf(termfreq(bookname:bc)=1)
0.71231794 = idf(docfreq=3, numdocs=3)
1.25 = fieldnorm(field=bookname, doc=1)[/quote]
發現fieldnorm值有0.625變成了1.25,所以就是乘以了2.0
接下來再對第二個文件增加激勵因子:doc2.setboost(2.0f);
執行結果變為:
[quote]ab bc 1.0
1.7807949 = (match) fieldweight(bookname:bc in 1), product of:
1.0 = tf(termfreq(bookname:bc)=1)
0.71231794 = idf(docfreq=3, numdocs=3)
2.5 = fieldnorm(field=bookname, doc=1)[/quote]
發現fieldnorm又乘以了2,所以說對於document和field的setboost都會乘到一起。
因為該文件的最終的score超過了1.0變成1.7807949,所以其他的兩個文件的最終得分都要除以該值,
分別變成:
[quote]bc bc 0.35355335
ab bc cd 0.19999999[/quote]
相信通過上面的解釋,大家就可以形象得理解lucene的打分機制,同時也知道如何來改變文件的得分。
lucene 的評分機制
elasticsearch是基於lucene的,所以他的評分機制也是基於lucene的。評分就是我們搜尋的短語和索引中每篇文件的相關度打分。如果沒有干預評分演算法的時候,每次查詢,lucene會基於乙個評分演算法來計算所有文件和搜尋語句的相關評分。使用lucene的評分機制基本能夠把最符合使用者需要...
lucene 的評分機制
elasticsearch是基於lucene的,所以他的評分機制也是基於lucene的。評分就是我們搜尋的短語和索引中每篇文件的相關度打分。如果沒有干預評分演算法的時候,每次查詢,lucene會基於乙個評分演算法來計算所有文件和搜尋語句的相關評分。使用lucene的評分機制基本能夠把最符合使用者需要...
Lucene評分機制
tfidfsimilarity類中定義了lucene評分的要素。重寫這些要素計算實現可以方便的修改lucene的打分機制。擴充套件閱讀 introduction to information retrieval,chapter 6 下面將從資訊檢索模型到具體 有效地 實現來描述lucene如何實現評...