深入理解Lucene預設打分演算法

2021-08-07 11:53:22 字數 2664 閱讀 7961

當談論到查詢的相關性,很重要的一件事就是對於給定的查詢語句,如何計算文件得分。文件得分是乙個用來描述查詢語句和文件之間匹配程度的變數。如果你希望通過干預lucene查詢來改變查詢結果的排序,你就需要對lucene的得分計算有所理解。

暫時還是先回來繼續**打分機制。為了計算出乙個文件的得分,我們必須考慮如下的因素:

lucene概念上的打分公式是這樣的:(tf/idf公式的概念版)

上面的公式展示了布林資訊檢索模型和向量空間資訊檢索模型的組合。我們暫時不去討論它,直接見識下lucene實際應用的打分公式:

可以看到,文件的分數實際上是由查詢語句q和文件d作為變數的乙個函式值。打分公式中有兩部分不直接依賴於查詢詞,它們是coord和querynorm。公式的值是這樣計算的,coord和querynorm兩大部分直接乘以查詢語句中每個查詢詞計算值的總和。另一方面,這個總和也是由每個查詢詞的詞頻(tf),逆文件頻率(idf),查詢詞的權重,還有norm,也就是前面說的length norm相乘而得的結果。聽上去有些複雜吧?不用擔心,這些東西不需要全部記住。你只需要知道在進行文件打分的時候,哪些因素是起決定作用的就可以了。基本上,從前面的公式中可以提煉出以下的幾個規則:

文件的域越小(包含比較少的term),文件的得分就越高。

設定的權重(索引和搜尋時設定的都可以)越大,文件得分越高。

下面詳細解釋公式乘積的每個因子的含義,以及是如何計算的,這樣能夠加深對lucene得分計算的理解,才能在實際應用中根據需要調整各個引數,從而制定滿足應用的排序策略。

coord(q,d)

評分因子,是基於文件中出現查詢項的個數。越多的查詢項在乙個文件中,說明些文件的匹配程式越高。預設是出現查詢項的百分比。這個評分因子的計算公式是:

public float coord(int overlap, int maxoverlap)
其中:

比如檢索」english book」, 現在有乙個文件是」this is an chinese book」。那麼,這個搜尋對應這個文件的overlap為1(因為匹配了book),而maxoverlap為2(因為檢索條件有兩個book和english)。最後得到的這個搜尋對應這個文件的coord值為0.5。

querynorm(q)

querynorm(q)是查詢權重對得分的影響,這個因素對所有文件都是一樣的值,所以它不影響排序結果。比如如果我們希望所有文件的評分大一點,那麼我們就需要設定這個值。它的計算公式如下:

public float querynorm(float sumofsquaredweights)
tf(t in d)

即term t在文件d中出現的個數,它的計算公式官網給出的是:

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

idf(t)

關聯到反轉文件頻率,文件頻率指出現 term t 的文件數docfreq。docfreq 越少 idf 就越高(物以稀為貴),但在同乙個查詢下些值是相同的。預設實現:

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

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

我要搜尋的詞語是」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
boost(t)

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

norm(t,d)

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

比如兩個文件:

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

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

public float lengthnorm(fieldinvertstate state)
比如我現在有乙個文件:chinese book,搜尋的詞語為chinese, 那麼numterms為2,lengthnorm的值為 1/sqrt(2) = 0.71428571428571。

索引的時候,把 norm 值壓縮(encode)成乙個 byte 儲存在索引中。搜尋的時候再把索引中 norm 值解壓(decode)成乙個 float 值,這個 encode/decode 由 similarity 提供。官方說:這個過程由於精度問題,以至不是可逆的,如:decode(encode(0.714)) = 0.625

注意事項:

Lucene預設的打分演算法 ES預設

隨著apache lucene 4.0版本在2012年的發布,這款偉大的全文檢索工具包終於允許使用者修改預設的基於tf idf原理的打分演算法。lucene api變得更加容易修改和擴充套件打分公式。但是,對於文件的打分計算,lucene並只是允許使用者在打分公式上修修補補,lucene 4.0推出...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

mysql 索引深入理解 深入理解MySql的索引

為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...