Lucene的評分 score 機制的簡單解釋

2021-08-22 15:36:05 字數 2407 閱讀 7731

通過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如何實現評...