ElasticSearch多shard場景相關度打分不準確問題
阿新 • • 發佈:2019-01-06
如果一個Index有多個shard的話,那麼搜尋的結果可能不太準確。
比如我們在某一個shard中,有很多個document,假設有20個文件的record.desc中包含Premium,當搜尋Premium的請求到達這個shard的時候,會利用TF/IDF計算相關度演算法:
TF: Term Frequency的縮寫,表示該term在當前document出現的頻率
IDF: Inverse Document Frequency縮寫,表示該term在所有文件中出現的頻率
所以根據這個公式我們可以得出一個結論:
如果該term在當前文件出現次數越高,那麼分值越大;如果該term在所有文件出現的頻率越小,那麼分值越大
但是在ElasticSearch中,他計算IDF只是在local shard上計算,不會計算其他的shard上的詞頻,所以這樣就會導致每一個shard上計算掉結果不一樣。
該如何解決呢?
# 生產環境下,資料量大,儘可能實現均勻分配
# 測試環境下,將索引的primary shard設定為1個,number_of_shards=1,index settings
# 測試環境下,搜尋附帶search_type=dfs_query_then_fetch引數,會將local IDF取出來計算global IDF。
計算一個doc的相關度分數的時候,就會將所有shard對的local IDF計算一下,獲取出來,在本地進行global IDF分數的計算,會將所有shard的doc作為上下文來進行計算,也能確保準確性
但是生產不建議開啟,因為效能很差。