1. 程式人生 > >Elasticsearch統計聚合案例分析

Elasticsearch統計聚合案例分析

  • 情景

通過ES聚合功能實現類似,對某個欄位統計該欄位的每個值在某一段時間內的對應的總數,例如對車牌統計,結果大概形式是:車牌1:100,車牌2:90,車牌3:85…

  • 問題

如果指定了返回條數,比如傳入了size=10或者size 預設值,而沒有指定shardSize=0,那麼結果是不正確!!!這點很容易被忽略掉!

  • 問題定位

問題原因定位的步驟如下(伺服器中資料固定,沒有實時資料):

  • 測試程式碼

  • 測試用例
  • 預設情況,size和shardSize預設;  

  • 結果如下(只有10條,預設是有序的):--- 結果不正確

  • 指定size=10,shardSize預設;

  • 結果(只有10條,預設是有序的):--- 結果不正確

  • 指定size=0,shardSize預設;

  • 結果(資料較多,只擷取一部分,預設排序了):--- 結果正確

  • 指定size=0,shardSize=10;

結果(資料較多,只擷取一部分,預設排序):--- 結果正確

  • 指定size=10和shardSize =10

   結果(只有10條,預設是有序的):--- 結果不正確

  • 指定size=0和shardSize=0

結果(資料較多,只取前面一部分,預設排序了):--- 結果正確

  • 指定size=10,shardSize=0;

結果(只有10條,預設是有序的):--- 結果正確

  • 指定shardSize=0,size預設;

結果(只有10條,預設是有序的):--- 結果正確

  • 指定shardSize=10,size預設;

             結果(只有10條,預設是有序的):--- 結果不正確

  • 結果分析
  • 當size=0時:
    • 如果shardSize=0時,結果返回所有資料,且結果正確
    • 如果shardSize!=0時,結果返回所有資料,且結果正確
  • 當size!=0時:
    • 如果shardSize=0時,結果返回size,且結果正確
    • 如果shardSize!=0時,結果返回size,且結果不正確;
  • 當size預設
    • 如果shardSize=0時,結果返回size,且結果正確
    • 如果shardSize!=0時,結果返回size
      ,且結果不正確;
  • 當shardSize預設
    • 如果size=0時,結果返回所有資料,且結果正確
    • 如果size!=0時,結果返回size,且結果不正確
  • size和shardSize均預設
    • 結果返回10條,且結果不正確
  • 問題原因

ES預設到每個shard上查詢出來的條數是等於size的,比如指定size=10,那麼到每個shard上統計出排在前10的資料,最後彙總所有shard的前10條資料並求和並取最終前10條返回;但是,每個shard上的前10並不是一樣的,這樣就造成了結果不正確。

  • 解決方法
  1. 如果需要返回全部資料,則設定size=0,shardSize=0;
  2. 如果返回指定條數的資料,則設定size=指定數量,shardSize=0;