1. 程式人生 > 實用技巧 >elasticsearch關於explain引數解釋:docFreq docCount

elasticsearch關於explain引數解釋:docFreq docCount

背景介紹

排查問題時需要分析問題成因,設定explain為true,開啟分數列印後,公式雖然大差不離的看得懂,但是卻忘了幾個引數什麼意思,在這裡記錄一下。

樣例分析

首先任意選取一次explain的結果



圖中很明顯是在做tf和idf的計算,幾個比較迷惑人的地方

  1. 542是什麼意思
weight(topic_name:周杰倫 in 542) [PerFieldSimilarity], result of:

這裡面的542一開始我誤以為是docCount,後來發現不是…542是lucene文件內部的id,和外部的_id不同,不參與計算,無需理會。

  1. docFreq是什麼
    docFreq是指符合搜尋條件的doc數目有多少,圖中為5,我們可以理解為,符合topic_name:周杰倫這個召回條件的docCount在這個分片下有5篇。注意!!!是在這條資料對應的分片下!!!
  2. docCount是什麼
    docCount是指資料對應的分片下的文件總數,日常召回時會發現不同文件的docCount不一樣,而理論上應該是一樣的。原因就是來自於叢集的不同分片。同理,如果你專門去找2條來自於同一分片的資料驗證對比,可以發現docCount是相同的。
  3. termFreq是什麼
    搜尋詞在該欄位中出現的次數。這裡注意不是簡單理解上的搜尋次數,需要看欄位的型別,如果是不分詞欄位,則必須要完全匹配才會有一次。
    關於分片的原理參考Elasticsearch引數search_type與分散式原理
    這篇部落格的這一段說法,說得很好,很容易理解

從定義可知,idf僅僅與搜尋關鍵詞有關,與文件無關。所以同一輸入來說,所有的文件應該是共享同一idf的。但事實上並非如此。原因就在elasticsearch的分散式機制。elasticsearch的索引(index)會被分片(shard),而每一個分片相當於一個獨立的搜尋引擎。每一次搜尋任務會被分配到不同的shard去執行,然後將各個shard的結果彙總起來得到最終我們看到的結果。而評分的過程會在shard完成,因此不同分片下,會得到不同的idf。這裡需要有個前提假設是文件數量足夠多的時候各個分片的詞頻會趨近,因此idf的差異也就不大。但是如果文件數量不夠多的時候啟用分片,可能詞頻在不同分片會有較大的差異,我遇到的情況就是這樣的

結論

在排查相關性分數相關問題時首先開啟explain檢視具體計算方式,而這些計算分數的因子可能受分片數量影響,需要注意



作者:十五倍壓槍
連結:https://www.jianshu.com/p/ffecea5c7360
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。