天天看點

Es Bucket聚合(桶聚合)總結

Buket Aggregations(桶聚合)不像metrics Aggregations(度量聚合)那樣計算字段上的度量,而是建立文檔桶,每個檔案桶有效地定義一個文檔集。除了bucket本身之外,bucket聚合還計算并傳回“落入”每個bucket的文檔的數量。與度量聚合相反,桶聚合可以嵌套子聚合。這些子聚合将為它們的“父”桶聚合建立的桶進行聚合。ES Bucket Aggregations對标關系型資料庫的(group by)。

首先我們來介紹桶聚合兩個常用參數intervals、time_zone的含義。

1、Intervals

定義桶的間隔,其可選值如下:

  • seconds:1, 5, 10, 30的倍數。
  • minutes:1, 5, 10, 30的倍數。
  • hours:1, 3, 12的倍數。
  • days:1,7的倍數。
  • months:1, 3的倍數。
  • years:1, 5, 10, 20, 50, 100的倍數。

2、Time Zone

對于日期類型,可以使用time_zone來指定時區,可選值可以是相對ISO 8601 utc的相對值,例如+01:00或-08:00,也可以是時區ID,例如America/Los_Angeles。

3、Histogram Aggregation

直方圖聚合,Date Histogram Aggregation是其特例。

動态将文檔中的值按照特定的間隔建構桶,并計算落在該桶的數量,文檔中的值根據如下函數進行近似比對:

bucket_key = Math.floor((value - offset) / interval) * interval + offset,

其中interval必須是正小數(包含正整數),offset為[0,interval)。

主要支援的參數如下:

  • keyed:響應結果傳回組織方式(數組或對象),具體示例請參考日期類直方圖聚合。
  • doc_count:比對的文檔數量。
  • offset 偏移量:更改每個bucket(桶)的開始時間,例如将offset設定為"10",則上例中傳回的一個桶的key為:[10,30),如果offset設定為5,則第一個桶的key為[15,30)。
  • order:預設按照key的升序進行排序,可以通過order字段來指定排序,其值為BucketOrder。其取值:
  • BucketOrder.count(boolean asc):按比對文檔格式升序/降序排序。
  • BucketOrder.key(boolean asc):按key的升序或降序排序。
  • BucketOrder.aggregation:通過定義一個子聚合進行排序。
  • BucketOrder.compound(List< BucketOrder> orders):建立一個桶排序政策,該政策根據多個條件對桶進行排序。
  • min_doc_count:表示隻顯示比對的文檔大于等于min_doc_count的桶。

4、Date Histogram Aggregation

日期字段直方圖聚合。

4.1 interval 取值

  • milliseconds (ms):毫秒,固定長度,支援倍數,通常使用1000的倍數。
  • seconds (s):秒
  • minutes (m):分鐘。所有的分鐘從00秒開始。1m,表示在指定時區的第一分鐘00s到下一分鐘00s之間的時間段。{n}m,表示時間間隔,等于n * 60 * 1000 毫秒。
  • hours (h):小時,其分鐘與秒都從00開始。1小時(1h)是指定時區内第一個小時的00:00分鐘到下一個小時的00:00分鐘之間的時間間隔,用來補償其間的任何閏秒,進而使經過該小時的分鐘數和秒數在開始和結束時相同。{n}h,表示時間間隔,等于 n * 60 * 60 * 1000 毫秒的時間間隔。
  • days (d):一天(1d)是在指定的時區内,從一天的開始到第二天的開始的時間間隔。{n}d,表示時間間隔,等于n * 24 * 60 * 60 * 1000毫秒。
  • weeks (w):1周(1w)為開始日:of_week:hour:minute:second與一周的同一天及下一周的時間在指定時區的間隔。不支援 {n}w。
  • months (M):一個月(1M)是本月開始之間的時間間隔的一天與次月的同一天。不支援{n}M
  • quarters (q):季度,不支援{n}q。
  • years (y):年, 不支援{n}y。

郭慕榮