Elasticsearch 系列 (5):用 Aggregation 語法,回傳每天的每秒資料筆數的最大值

EJ Feng
4 min readDec 4, 2019

--

使用巢狀聚合分析語法 Date Histogram Aggregation+Date Histogram Aggregation+Bucket Sort Aggregation

目標:回傳每天的每秒資料筆數的最大值

要「在 input 時間區間範圍內的資料,計算每秒的資料筆數(event per second),回傳每天 EPS 最大值的數字」。

Sample 資料內容

期望的 output

  • 先分成每天,12/1、12/2、12/3,共三天。
  • 12/1 的每秒的資料數為 1、1、1,最大值為 1。
  • 12/2 的每秒的資料數為 1、1、1、1,最大值為 1。
  • 12/3 的每秒的資料數為 1、2、3,最大值為 3。

結論:Date Histogram Aggregation+Date Histogram Aggregation+Bucket Sort Aggregation

可以使用的語法:

Elasticsearch 的 Query 語法
在 Elasticsearch Head 實驗結果符合預期

研究過程 1. 先用 Date Histogram Aggregation

先將資料依照「天」去做分類:

研究過程 2. 將資料依照「秒」來做分類

看可不可以再將資料依照「秒」來做分類。從 Date Histogram Aggregation 的文件中來看,Date Histogram Aggregation 好像可以用 fixed_interval 來做秒的分類。但是實際試的時候有遇到一些問題,先用「小時」來分類:

可以看起來蠻正常的。但是如果將 fixed_interval 換成 1m 的話,就會多出很多不必要資訊(doc_count 是 0 的):

希望把 doc_count 是 0 的資料拿掉。加上 min_doc_count 設定可以做到:

再將 fixed_interval 換成 1s,這時就可以 work:

研究過程 3. 找最大 doc_count 的 bucket

先嘗試將以「秒」分類的 bucket 做由大到小排序,使用 order 功能:

因為嘗試 Max Bucket Aggregation 一直不成功,所以改用 Bucket Sort Aggregation,將以秒分類的 bucket 依照 doc_count 排序後,只顯示第一個即為最大值。

也算是有達到目標效果。先這樣吧!!

其他:too_many_buckets_exception

把資料依照「秒」來區分的時候,有出現以下錯誤:

Trying to create too many buckets. Must be less than or equal to: [10000] but was [10001]. This limit can be set by changing the [search.max_buckets] cluster level setting.

太多 buckets 了會出現錯誤,可以用 min_doc_count 設定將 doc_count 是 0 的 bucket 移除。

結束~!

--

--

EJ Feng
EJ Feng

Written by EJ Feng

各種技術研究紀錄:D

No responses yet