tfidfsimilarity類中定義了lucene評分的要素。重寫這些要素計算實現可以方便的修改lucene的打分機制。
擴充套件閱讀:introduction to information retrieval, chapter 6
下面將從資訊檢索模型到具體(有效地)實現來描述lucene如何實現評分。我們首先簡要介紹下向量空間模型評分(vsm score),之後匯出lucene理論評分公式,並據此最終推導出lucene實際評分方法(與lucene實現中使用的類、方法相關聯)
lucene混合了資訊檢索的布林模型(bm)和資訊檢索的向量空間模型——通過布林模型確定文件並通過vsm進行匹配程度評分。
在向量空間模型中,文件和查詢被表示為多維空間中的加權向量集。其每個不同的索引詞(term)對應乙個維度,在此維度上的權重是詞頻/逆向檔案頻率(tf-idf)值。
向量空間模型並不要求權重使用tf-idf值,不過tf-idf值被認為可以高效地評價搜尋結果,所以lucene使用tf-idf。之後將更加詳細的表述詞頻tf和逆向檔案頻率idf,但現在(作為結論)我們先設定:對於給定的詞(term)t和文件(或查詢)x,用tf(t,x)表示t在x中出現的次數,類似的用idf(t)表示包含詞t的所有文件數的反比。
文件d對於查詢q的向量空間模型評分vsm score等於加權查詢向量v(q)和v(d)之間的余弦相似性(cosine similarity):
cosine-similarity(q,d) =
v(q) · v(d)
–––––––––
|v(q)| |v(d)|
vsm score
其中v(q)·
v(d)是加權向量的
點乘積(dot product),
|v(q)|和
|v(d)|是各自的
歐幾里得度量(euclidean norms)(或者被叫作歐幾里得距離、模)。
note:上述等式可被視作標準化加權向量(v(q)除以它自己的歐幾里得度量,將其標準化為乙個單位向量)的點乘積。
lucene從搜尋質量與可用性方面重新定義了vsm score:
在上述單個索引域的簡化假定下,我們可以得到lucene理論評分公式:
score(q,d) = coord-factor(q,d) · query-boost(q) ·
v(q) · v(d)
–––––––––
|v(q)|
· doc-len-norm(d) · doc-boost(d)
lucene理論評分公式
這個理**式是基於以下前提下的簡化:(1)查詢term和文件是基於域的(2)加權因子通常是加在查詢term上的而不是查詢上的(譯註:乙個查詢可以有眾多的查詢term)
現在我們描述下lucene如何實現上述理**式,並匯出lucene實際評分方法。
為了高效率的評分運算,一些評分組成被預先運算整合:
文件長度標準化因子doc-len-norm(d)和文件權重因子doc-boost(d)在索引建立時確定。它們已經被事先(譯註:在索引建立時)運算並且它們的乘積已經在索引資料中單獨儲存:norm(d)。(在之後匯出的等式中,norm(t in d)意為norm(field(t) in doc d)其中field(t)是查詢term t對應的域。)
lucene實際評分方法從之前敘述中得出:
score(q,d) = coord(q,d)
· querynorm(q)
· ∑(
tf(t in d)
· idf(t)
2 · t.getboost()
· norm(t,d)
)t in q
lucene實際評分方法
其中:tf(t in d)與term的頻率有關,定義為當前評分的文件d中term t出現的次數。文件中出現給定term的次數越多得到的分值越高。注意tf(t in q)被假定為1,因此它不會出現在等式中,不過,如果乙個查詢包含兩次相同的查詢term,那麼將會有兩個具有相同term的term子查詢,因此計算結果仍然會保持正確(雖然不怎麼高效)。defaultsimilarity
中定義的預設的tf(t in d)計算方式為:
tf(t in d)
=
frequency½
idf(t)意為反向檔案頻率。這個值是文件頻率(docfreq)(出現term t的文件數)的反比。這意味著罕見的term會為查詢的總評分貢獻更多的分數。t的idf(t)值在查詢和文件中都會出現因此它在等式中被執行乘方。defaultsimilarity
中定義的預設的idf(t)計算方式為:
idf(t)
=
1 + log (
numdocs
–––––––––
docfreq+1
)coord(q,d)是乙個基於「在指定文件中查詢term匹配數」的評分因子。(譯註:term集:field1:query_value1,field2:query_value2,...中匹配數)。典型地,乙個匹配更多查詢term的文件要比乙個匹配少的文件得到更高的分數。這是乙個在進行搜尋時生效的被similarity類中的方法coord(q,d)
進行運算得出的搜尋態因子。
querynorm(q)是乙個用於使評分結果在查詢間可以進行比較的標準化因子。這個因子不會影響文件的排序(因為所有的排序文件(的分值)都會乘以相同的因子),而只是嘗試使評分結果在不同查詢間可比較。這是乙個在similarity類中在搜尋時生效進行運算得出的搜尋態因子。defaultsimilarity
中預設的運算會給出乙個歐幾里得度量(euclidean norms):
querynorm(q) =querynorm(sumofsquaredweights)
=
1––––––––––––––
sumofsquaredweights½
(查詢term的)平方加權和通過查詢weight
物件計算。例如,乙個booleanquery
通過如下方式運算出這個值:
sumofsquaredweights
=q.getboost()
2
· ∑(
idf(t) · t.getboost()
)2t in q
t.getboost()在查詢文字中指定(參見query syntax)或者通過程式呼叫setboost()
進行設定的查詢q中term t的搜尋態加權因子。注意,確實沒有乙個直接的api可以訪問一組混合term查詢中的乙個term的加權因子,不過混合的term被表示成乙個混合了多個termquery
物件的查詢,於是查詢中的乙個term的加權因子可以通過呼叫子查詢的getboost()
方法來訪問。
norm(t,d)封裝了一小部分加權和長度因子(在索引建立階段):
computenorm(org.apache.lucene.index.fieldinvertstate)
方法負責把結合這些因子運算成乙個單獨的浮點數。 當乙個文件被加入索引時,以上所有因子會被相乘。如果文件中存在同名的域(譯註:多值域),那麼它們的加權會乘在一起(譯註:即進行乘方運算):
norm(t,d) = lengthnorm ·
∏f.boost
()
fieldfin d named ast
注意到了執行搜尋操作的時候再修改評分的norm(譯註:規則,而不是值)就太晚了, 例如使用乙個不同的similarity
類來執行搜尋時。
Lucene(三)評分機制
每當搜尋到匹配文件時,該文件都會被賦予一定的分值,用以反映匹配程度。該分值會計算文件與查詢之間的相似程度嗎,更高的分值反映了更強的相似程度和匹配程度。評分因子 描述tf t in d 項頻率因子 文件 d 中出現項 t 的頻率 idf t 項在倒排檔案中出現的頻率 它被用來衡量項的 唯一 性。出現頻...
lucene 的評分機制
elasticsearch是基於lucene的,所以他的評分機制也是基於lucene的。評分就是我們搜尋的短語和索引中每篇文件的相關度打分。如果沒有干預評分演算法的時候,每次查詢,lucene會基於乙個評分演算法來計算所有文件和搜尋語句的相關評分。使用lucene的評分機制基本能夠把最符合使用者需要...
lucene 的評分機制
elasticsearch是基於lucene的,所以他的評分機制也是基於lucene的。評分就是我們搜尋的短語和索引中每篇文件的相關度打分。如果沒有干預評分演算法的時候,每次查詢,lucene會基於乙個評分演算法來計算所有文件和搜尋語句的相關評分。使用lucene的評分機制基本能夠把最符合使用者需要...