ElasticSearch--Lucene是怎麼計算相關度的

話不多說,直接上公式
這裏寫圖片描述
公式說明:

  1. score(q,d)是文檔 d 和查詢 q 之間的相關度
  2. queryNorm(q)是查詢正則化因子 %
  3. coord(q,d)是coordination factor %
  4. 對在查詢字符串q中的每個單詞t在文檔d中的權重求和
  5. 詞頻,單詞t在文檔d中的詞頻
  6. t的idf
  7. t.getBoost()是一個權重的提升權重%
  8. norm(t,d) 是filed-length norm %

其中socre tf idf 是我們已經講過的。 queryNorm、coord、boost和norm 是沒講過的。

Query Normalization Factor

Query normalization 因子是一個想要正則化查詢,這樣讓我們可以比較不同查詢之間的相關度(但其實效果並不好).
這個因子在訪問的開始被計算,而實際的計算依賴於查詢,一個典型的實現是
這裏寫圖片描述
sumOfSquaredWeights 是把所有單詞的IDF加起來然後開根號

Query Coordination

coordination 因子是想要對含有高比例的訪問單詞一個相關度獎勵。越多的訪問單詞出現在文檔中,越意味着高的相關度。 例如我們有一個query:quick brown fox, 並且每個單詞的權重是1.5。如果沒有coordination 因子,相關度會僅僅是單詞權重的求和。例如:
文檔fox -> score:1.5
文檔quick fox -> socre:3.0
文檔 quick brown fox -> socre:4.5
coordination因子將score乘以匹配單詞的數量再除以總共訪問單詞的數量。用了coodination因子後:
文檔fox: socre:1.5*1/3 = 0.5
文檔quick fox: score:3.0*2/3 = 2.0
文檔 quick brown fox -> socre:4.5*3/3 = 4.5
可以看出來這樣子導致含有所有訪問單詞的文檔擁有更高的相關度

bool 查詢默認使用coordination。但是也我們也可以關閉這個功能。
coordination是一個好東西,但是在某些高端點的場景中,我們需要關閉這個功能,例如搜索jump、leap和hop這些詞的時候。我們不關係有多少近義詞的呈現,因爲它代表相近的意思。

Index-Time Filed-Level Boosting

在查詢的時候我們可能想提高某個filed的權重,
下邊有三點建議:

  1. 將boost和filed-length norm一起用
  2. 若要修改index-time boost, 則不需重新索引所有的文檔。而query-time boost, 則不需要,可以在任何時候都修改
  3. 如果一個filed在index-time boost有好幾個值,會極大的提高這個filed的權重
    Query-time boosting is a much simpler, cleaner, more flexible option.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章