改變Lucene的打分模型
隨着Apache Lucene 4.0版本在2012年的發布,這款偉大的全文檢索工具包終於允許用戶修改默認的基於TF/IDF原理的打分算法。Lucene API變得更加容易修改和擴展打分公式。但是,對於文檔的打分計算,Lucene並只是允許用戶在打分公式上修修補補,Lucene 4.0推出了更多的打分模型,從根本上改變了文檔的打分公式,允許用戶使用不同的打分公式來計算文檔的得分。在本節,我們將深入了解Lucene 4.0的新特性,以及這些特性如何融入ElasticSearch。
可用的相似度模型
前面已經提到,除了Apache Lucene 4.0以前版本中原來支持的默認相似度模型,TF/IDF模型同樣支持。該模型在 第2章 強大的用戶查詢語言DSL 的 Lucene 默認打分算法一節中已經詳細論述了。
新引入了三種相似度模型:
- Okapi BM25:這是一種基於概率模型的相似度模型,對於給定的查詢語句,該模型會估計每個文檔與查詢語句匹配的概率。為了在ElasticSearch中使用 該相似度模型,用戶需要使用模型的名稱,BM25。據說,Okapi BM25相似度模型最適合處理短文本,即關鍵詞的重復次數對整個文檔得分影響比較大的文本。
- Divergence from randomness:這是一種基於同名概率模型的相似度模型。想要在ElasticSearch使用該模型,就要用到名稱,DFR。據說該相似度模型適用於自然語言類的文本。
- Information based:這是最后一個新引入的相似度模型,它與Diveragence from randomness模型非常相似。想要在ElasticSearch使用該模型,就要用到名稱,IB。與DFR相似度模型類似,據說該模型也適用於自然 語言類的文本。
Lucene默認的打分算法
當談論到查詢的相關性,很重要的一件事就是對於給定的查詢語句,如何計算文檔得分。首先要弄清楚的是文檔得分是什么。文檔得分是一個用來描述查詢語句和文檔之間匹配程度的變量。在本節,我們將學習Lucene默認的打分機制:TF/IDF(term frequency/inverse document frequecy)算法,以及它是如何對相關文檔進行打分排序。理解默認的打分算法對設計復雜查詢語句來說至關重要,特別是在決定各個查詢子句權重的時候。
匹配文檔的打分因子
當一個文檔出現在了搜索結果中,這就意味着該文檔與用戶給定的查詢語句是相匹配的。Lucene會對匹配成功的文檔給定一個分數。至少從 Lucene這個層面,從打分公式的結果來看,分數值越高,代表文檔相關性越高。 自然而然,我們可以得出:兩個不同的查詢語句對同一個文檔的打分將會有所不同,但是比較這兩個得分是沒有意義的。用戶需要記住的是:我們不僅要避免去比較 不同查詢語句對同一個文檔的打分結果,還要避免比較不同查詢語句對文檔打分結果的最大值。這是因為文檔的得分是多個因素共同影響的結果,不僅有權重 (boosts)和查詢語句的結構起作用,還有匹配關鍵詞的個數,關鍵詞所在的域,查詢歸一化因子中用到的匹配類型……。在極端情況下,只是因為我們用了 自定義打分的查詢對象或者由於倒排索引中詞的動態變化,相似的查詢表達式對於同一個文檔都會產生截然不同的打分。
暫時還是先回來繼續探討打分機制。為了計算出一個文檔的得分,我們必須考慮如下的因素:
- 文檔權重(Document boost):在索引時給某個文檔設置的權重值。
- 域權重(Field boost):在查詢的時候給某個域設置的權重值。
- 調整因子(Coord):基於文檔中包含查詢關鍵詞個數計算出來的調整因子。一般而言,如果一個文檔中相比其它的文檔出現了更多的查詢關鍵詞,那么其值越大。
- 逆文檔頻率(Inerse document frequency):基於Term的一個因子,存在的意義是告訴打分公式一個詞的稀有程度。其值越低,詞越稀有(這里的值是指單純的頻率,即多少個文檔中出現了該詞;而非指Lucene中idf的計算公式)。打分公式利用這個因子提升包含稀有詞文檔的權重。
- 長度歸一化(Length norm):基於域的一個歸一化因子。其值由給定域中Term的個數決定(在索引文檔的時候已經計算出來了,並且存儲到了索引中)。域越的文本越長,因子的權重越低。這表明Lucene打分公式偏向於域包含Term少的文檔。
- 詞頻(Term frequency):基於Term的一個因子。用來描述給定Term在一個文檔中出現的次數,詞頻越大,文檔的得分越大。
- 查詢歸一化因子(Query norm):基於查詢語句的歸一化因子。其值為查詢語句中每一個查詢詞權重的平方和。查詢歸一化因子使得比較不同查詢語句的得分變得可行,當然比較不同查詢語句得分並不總是那么易於實現和可行的。
TF/IDF打分公式
接下來看看打分公式的廬山真面目。如果只是為了調整查詢語句之間的關聯關系,用戶不必去理解它的原理。但是至少要知道它是如何工作的。
Lucene概念上的打分公式
TF/IDF公式的概念版是下面這個樣子的:
上面的公式展示了布爾信息檢索模型和向量空間信息檢索模型的組合。我們暫時不去討論它,直接見識實際應用的公式,它是在Lucene實現並且正在使用的公式。