天天看点

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。

郭慕荣