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