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