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。
郭慕榮