Elasticsearch統計聚合案例分析
阿新 • • 發佈:2018-12-09
- 情景
通過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並不是一樣的,這樣就造成了結果不正確。
- 解決方法
- 如果需要返回全部資料,則設定size=0,shardSize=0;
- 如果返回指定條數的資料,則設定size=指定數量,shardSize=0;