lucene 的文件評分機制

2021-08-25 14:00:15 字數 2532 閱讀 9438

elasticsearch是基於lucene的,所以他的評分機制也是基於lucene的。評分就是我們搜尋的短語和索引中每篇文件的相關度打分。

如果沒有干預評分演算法的時候,每次查詢,lucene會基於乙個評分演算法來計算所有文件和搜尋語句的相關評分。

使用lucene的評分機制基本能夠把最符合使用者需要的搜尋放在最前面。

當然有的時候,我們可能想要自定義評分演算法,這個就和lucene的評分演算法沒有什麼關係了。當然,我們大多數應該還是會根據自己的需求,來調整lucene本身的演算法。

lucene的評分是叫做tf/idf演算法,基本意思就是詞頻演算法。

根據分詞詞庫,所有的文件在建立索引的時候進行分詞劃分。進行搜尋的時候,也對搜尋的短語進行分詞劃分。

tf代表分詞項在文件中出現的次數(term frequency),idf代表分詞項在多少個文件中出現(inverse document frequency)。

lucene的演算法簡單來說就是將搜尋的短語進行分詞得出分詞項,每個分詞項和每個索引中的文件根據tf/idf進行詞頻出現的評分計算。

然後每個分詞項的得分相加,就是這個搜尋對應的文件得分。

這個評分公式有6個部分組成

這個評分因子的計算公式是:

public float coord(int overlap, int maxoverlap)
比如檢索"english book", 現在有乙個文件是"this is an chinese book"。

那麼,這個搜尋對應這個文件的overlap為1(因為匹配了book),而maxoverlap為2(因為檢索條件有兩個book和english)。

最後得到的這個搜尋對應這個文件的coord值為0.5。

這個因素對所有文件都是一樣的值,所以它不影響排序結果。比如如果我們希望所有文件的評分大一點,那麼我們就需要設定這個值。

public float querynorm(float sumofsquaredweights)
項t在文件d中出現的次數

public float tf(float freq)
比如有個文件叫做"this is book about chinese book", 我的搜尋項為"book",那麼這個搜尋項對應文件的freq就為2,那麼tf值就為根號2,即1.4142135

public float idf(long docfreq, long numdocs)
這裡的兩個值解釋下

我在用es實際看這裡的時候遇到乙個問題,numdocs數和實際的文件數不一致,最後弄明白了,這裡的numdocs指的是分片的文件資料,而不是所有分片的文件數。

所以使用es分析這個公式的時候,最好將分片數設定為1。

比如我現在有三個文件,分別為:

我要搜尋的詞語是"chinese",那麼對第二篇文件來說,docfreq值就是1,因為只有乙個文件符合這個搜尋,而numdocs就是3。最後算出idf的值是:

(float)(math.log(numdocs/(double)(docfreq+1)) + 1.0) = ln(3/(1+1)) + 1 = ln(1.5) + 1 = 0.40546510810816 + 1 = 1.40546510810816

查詢時期項t的加權,這個就是乙個影響值,比如我希望匹配chinese的權重更高,就可以把它的boost設定為2

這個項是長度的加權因子,目的是為了將同樣匹配的文件,比較短的放比較前面。

比如兩個文件:

我搜尋chinese的時候,第乙個文件會放比較前面。因為它更符合"完全匹配"。

norm(t,d) = doc.getboost()· lengthnorm· ∏ f.getboost()

public float lengthnorm(fieldinvertstate state)

這裡的doc.getboost表示文件的權重,f.getboost表示欄位的權重,如果這兩個都設定為1,那麼nor(t,d)就和lengthnorm一樣的值。

比如我現在有乙個文件:

搜尋的詞語為chinese, 那麼numterms為2,lengthnorm的值為 1/sqrt(2) = 0.71428571428571。

但是非常遺憾,如果你使用explain去檢視es的時候,發現lengthnorm顯示的只有0.625。

這個官方給出的原因是精度問題,norm在儲存的時候會進行壓縮,查詢的時候進行解壓,而這個解壓是不可逆的,即decode(encode(0.714)) = 0.625。

es中可以使用_explain介面進行評分解釋檢視。

比如現在我的文件為:

搜尋詞為:

}}

explain得到的結果為:

]},,

]}]}

}

看到這篇文件的總得分為 0.878415

Lucene評分機制

tfidfsimilarity類中定義了lucene評分的要素。重寫這些要素計算實現可以方便的修改lucene的打分機制。擴充套件閱讀 introduction to information retrieval,chapter 6 下面將從資訊檢索模型到具體 有效地 實現來描述lucene如何實現評...

lucene 的評分機制

elasticsearch是基於lucene的,所以他的評分機制也是基於lucene的。評分就是我們搜尋的短語和索引中每篇文件的相關度打分。如果沒有干預評分演算法的時候,每次查詢,lucene會基於乙個評分演算法來計算所有文件和搜尋語句的相關評分。使用lucene的評分機制基本能夠把最符合使用者需要...

lucene 的評分機制

elasticsearch是基於lucene的,所以他的評分機制也是基於lucene的。評分就是我們搜尋的短語和索引中每篇文件的相關度打分。如果沒有干預評分演算法的時候,每次查詢,lucene會基於乙個評分演算法來計算所有文件和搜尋語句的相關評分。使用lucene的評分機制基本能夠把最符合使用者需要...