文檔的分值代表了該文檔在特定查詢詞下對應的相關性高低,他關聯著信息檢索向量空間模型中的向量夾角的接近度。一個文檔越與查詢詞相關,得分越高。分值計算公式如下:
其中
1、tf(t in d)這個值衡量著Term在文檔中出現的頻率,也就是詞頻。關鍵詞在文檔中出現的次數越多,得分越高,這個值在DefaultSimilarity的計算公式如下(詞頻的平方根):
2、idf(t)代表著該詞的逆詞頻,這個值衡量了該詞在整個文檔庫中出現的頻度。這意味著,一個詞出現的越少,根據香農的信息公示,他越珍稀。同時將貢獻更多的分值給總分 值。默認的計算公式如下(其中numDocs代表整個文檔的數量,docFreq代表了含有Term t的文檔數量):
3、coord(q,d)這個分值衡量了文檔中含有多少Term。文檔中出現的越多,越全,將獲得越高的分值。舉個例來說,查詢“lucene”和”Apache”,同時出現兩個Term的肯定比隻出現一個lucene或者Apache的分值高。這個值是搜索時動態計算的,默認的計算公式如下:
4、queryNorm(q)這個標準化因子用於在多個查詢器中進行比較。它並不影響文檔的排名。它的主要作用在於多個查詢器返回的結果進行比較,甚至是結果來自多個索引時。這是搜索時的權重因子,當給查詢器設置權重時就是通過這個因子進行影響的。默認的實現公式如下:
其中的sumOfSquaredWeights的計算公式如下:(可以清晰的看到獲取query的boost,當沒給查詢器設置值時,默認為1,不起作用)
5、t.getBoost()該值是一個搜索時權重因子,可以在查詢時給不同的Term設置不同的權重,可以通過lucene語法,也可以通過setBost()函數,注意,在多Term查詢器中,是沒有獲取單一Term權重的函數的,所以如果需要獲取,隻能調用相應的子查詢器函數的getBoost()函數。
6、norm(t,d)封裝了一些索引時因子以及長度因子。
Document boost – 在索引時,添加到Index前可以通過doc.setBoost()設置,衡量了Document的重要程度。.
Field boost – 在將字段加入到文檔前可以通過調用field.setBoost()來設置字段的權重。
lengthNorm(field) – 該值在將文檔添加到索引時,根據所有文檔中特定字段的Term數來計算。所以默認更短的字段將貢獻更多的分值。
當文檔加入索引時,以上因子將相乘,如果一個文檔中有多個同名的字段,那麽將多個多同的權重也相乘。
可是還有件值得注意的事情,這個值在索引時計算完畢後將編碼為一個Byte存儲起來,在搜索時,再從文件中讀取出該值並解碼成float。在這個過程中,可 能會造成精度的缺失,並不能保證decode(encode(x)) = x,比如,有可能decode(encode(0.89)) = 0.75,同樣值得注意的是,在搜索時改變此值已經太晚了。例如,用一個不同於DefaultSimilarity的實現。
相關函數:
setDefault(Similarity), IndexWriter.setSimilarity(Similarity), Searcher.setSimilarity(Similarity)
本翻譯屬於原創,轉載時請注明出處。英文原版請查看:
hudson.zones.apache.org/hudson/job/Lucene-trunk/javadoc//org/apache/lucene/search/Similarity.html
本文轉載自:http://blog.csdn.net/duck_genuine/article/details/6394701