本地英文版地址: ../en/search-aggregations-bucket-autodatehistogram-aggregation.html
一个类似于日期直方图聚合的多桶聚合,但不是靠给定的 间隔(interval) 来作为每个桶的宽度,而是给定目标桶的数量来指示所需的桶数,并且自动选择桶的间隔以用最好的方式来实现该目标。 返回的桶数将始终小于或等于该目标数。
buckets 字段是可选的,如果未指定,将默认为 10 个桶。
以10个桶为目标进行请求。
POST /sales/_search?size=0 { "aggs" : { "sales_over_time" : { "auto_date_histogram" : { "field" : "date", "buckets" : 10 } } } }
在内部,一个日期被表示为一个64位的数字-一个时间戳,以毫秒为单位。
这些时间戳作为桶的键(key)
返回。
key_as_string
是使用 format
参数指定的格式(format)转换为格式化的日期字符串的相同时间戳:
如果未指定 format
(格式),则它将使用字段映射中指定的第一个日期 格式(format)。
POST /sales/_search?size=0 { "aggs" : { "sales_over_time" : { "auto_date_histogram" : { "field" : "date", "buckets" : 5, "format" : "yyyy-MM-dd" } } } }
支持表达性的日期 格式模式 |
响应:
{ ... "aggregations": { "sales_over_time": { "buckets": [ { "key_as_string": "2015-01-01", "key": 1420070400000, "doc_count": 3 }, { "key_as_string": "2015-02-01", "key": 1422748800000, "doc_count": 2 }, { "key_as_string": "2015-03-01", "key": 1425168000000, "doc_count": 2 } ], "interval": "1M" } } }
基于聚合收集的数据选择返回桶的间隔,使得返回的桶的数量小于或等于请求的数量。 返回的间隔可能是:
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的倍数 |
在最坏的情况下,对于请求的桶数,每日桶数太多,返回的桶数将是请求的桶数的1/7。
日期时间以 UTC 存储在 Elasticsearch 中。
默认情况下,所有的分桶和舍入也在 UTC 中完成。
time_zone
参数可用于指示分桶时应该使用不同的时区。
时区可以指定为 ISO 8601 UTC 时差(例如+01:00
或 -08:00
),也可以指定为时区id(在TZ数据库中使用的标识符),比如America/Los_Angeles
。
看下面这个例子:
#添加并索引3个文档 PUT my_index/log/1?refresh { "date": "2015-10-01T00:30:00Z" } PUT my_index/log/2?refresh { "date": "2015-10-01T01:30:00Z" } PUT my_index/log/3?refresh { "date": "2015-10-01T02:30:00Z" } #搜索 GET my_index/_search?size=0 { "aggs": { "by_day": { "auto_date_histogram": { "field": "date", "buckets" : 3 } } } }
如果未指定时区则使用 UTC,从 UTC 时间的 2015年10月1日午夜开始返回3个1小时间隔的桶:
{ ... "aggregations": { "by_day": { "buckets": [ { "key_as_string": "2015-10-01T00:00:00.000Z", "key": 1443657600000, "doc_count": 1 }, { "key_as_string": "2015-10-01T01:00:00.000Z", "key": 1443661200000, "doc_count": 1 }, { "key_as_string": "2015-10-01T02:00:00.000Z", "key": 1443664800000, "doc_count": 1 } ], "interval": "1h" } } }
如果指定了time_zone
的值为-01:00
,则午夜从 UTC 午夜前一小时开始:
GET my_index/_search?size=0 { "aggs": { "by_day": { "auto_date_histogram": { "field": "date", "buckets" : 3, "time_zone": "-01:00" } } } }
现在仍返回3个1小时间隔的桶,但第一个桶开始于2015年9月30日晚上11:00,因为这是该时段在指定时区的当地时间。
{ ... "aggregations": { "by_day": { "buckets": [ { "key_as_string": "2015-09-30T23:00:00.000-01:00", "key": 1443657600000, "doc_count": 1 }, { "key_as_string": "2015-10-01T00:00:00.000-01:00", "key": 1443661200000, "doc_count": 1 }, { "key_as_string": "2015-10-01T01:00:00.000-01:00", "key": 1443664800000, "doc_count": 1 } ], "interval": "1h" } } }
当使用跟随 DST(夏令时)变化的时区时,靠近这些变化发生时刻的桶可能与相邻桶的大小略有不同。
例如,在 CET
时区开始夏令时:2016年3月27日凌晨2点,时钟拨快1小时至当地时间凌晨3点。
如果聚合的结果是每日一个桶,则当天的时段将仅保存23小时的数据,而不是其他时段通常的24小时。
对于较短的时间间隔,例如12小时,情况也是如此。
在这里,当夏令时转换发生时,我们在3月27日早上只有一个11小时的桶。
与普通的 date_histogram
(日期直方图) 一样,文档级脚本和值级脚本都受支持。
但是,此聚合不支持min_doc_count
、extended_bounds
及 order
参数。
minimum_interval
允许调用者指定应该使用的最小舍入区间。
这可以提高收集过程的效率,因为聚合不会以任何低于 minimum_interval
的时间间隔进行舍入。
minimum_interval
可以接受的单位有:
- year
- month
- day
- hour
- minute
- second
POST /sales/_search?size=0 { "aggs" : { "sale_date" : { "auto_date_histogram" : { "field" : "date", "buckets": 10, "minimum_interval": "minute" } } } }