跳到主要内容

自动间隔日期直方图 auto_date_histogram

Auto-interval Date Histogram Aggregation

类似于“Date Histogram Aggregation”的多桶聚合,不同之处在于,提供了指示所需桶数的目标桶数,并自动选择桶的间隔以最佳实现该目标,而不是提供用作每个桶宽度的间隔。返回的桶数始终小于或等于此目标数。

buckets字段是可选的,如果未指定,则默认为10个桶。

请求10个buckets。

POST /sales/_search?size=0
{
"aggs" : {
"sales_over_time" : {
"auto_date_histogram" : {
"field" : "date",
"buckets" : 10
}
}
}
}

Keys

在内部,日期表示为64位数字,表示自纪元以来的时间戳(以毫秒为单位)。这些时间戳作为bucket key返回。key_as_string是使用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"
}
}
}

Intervals

返回的桶的间隔是根据聚合收集的数据选择的,以便返回的桶数小于或等于请求的数量。

参数说明
seconds1、5、10和30的倍数
minutes1、5、10和30的倍数
days1和7的倍数
months1和3的倍数
years1、5、10、20、50和100的倍数

在最坏的情况下,如果每日存储桶的数量超过请求的存储桶数量,则返回的存储桶数将是请求存储桶数量的1/7。

Time Zone

日期时间以UTC格式存储在Elasticsearch中。默认情况下,所有分格和舍入也在UTC中完成。time_zone参数可用于指示分组应使用不同的时区。

考虑以下示例:

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,从2015年10月1日UTC午夜开始返回三个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"
}
}
}

如果指定了timezone -01:00,则午夜从UTC午夜前一小时开始:

GET my_index/_search?size=0
{
"aggs": {
"by_day": {
"auto_date_histogram": {
"field": "date",
"buckets" : 3,
"time_zone": "-01:00"
}
}
}
}

现在仍然返回三个1小时的存储桶,但第一个存储桶将于2015年9月30日晚上11点开始,因为这是指定时区中存储桶的本地时间。

{
...
"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小时的桶。

Script

与普通的date_histogram一样,支持文档级脚本和值级脚本。但是,此聚合不支持min_doc_count、extended_bounds和order参数。

Missing value

POST /sales/_search?size=0
{
"aggs" : {
"sale_date" : {
"auto_date_histogram" : {
"field" : "date",
"buckets": 10,
"missing": "2000/01/01"
}
}
}
}

publish_date字段中没有值的文档将与值为2000-01-01的文档属于同一个存储桶。