5.2.2. 自动间隔日期直方图聚合
自动间隔日期直方图聚合#
与日期聚合直方图除了提供一个间隔来用作每个存储桶的宽度外,还提供了一个目标存储桶数来指示所需的存储桶数,并自动选择存储桶的间隔以最佳地实现该目标。返回的存储桶数将始终小于或等于此目标数。
存储桶字段是可选的,如果未指定,则默认为 10 个存储桶。
要求目标为 10 个存储桶。
POST /sales/_search?size=0
{
"aggs" : {
"sales_over_time" : {
"auto_date_histogram" : {
"field" : "date",
"buckets" : 10
}
}
}
}
键#
在内部,日期表示为一个 64 位数字,表示自该时间点以来的毫秒数。这些时间戳作为存储桶键返回。 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"
}
}
}
时间间隔#
根据聚合收集的数据选择返回的存储桶的间隔,以使返回的存储桶数小于或等于请求的数量。返回的可能间隔是:
- 秒 | 1, 5, 10 和 30 的倍数
- 分 | 1, 5, 10 和 30 的倍数
- 时 | 1, 3 和 12 的倍数
- 日 | 1, 和 7 的倍数
- 月 | 1, 和 3 的倍数
- 年 | 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
。
考虑以下示例:
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 日午夜开始返回三个 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"
}
}
}
如果指定了 -01:00
的 time_zone
,则午夜在 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: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"
}
}
}
key_as_string
值表示指定时区中每一天的午夜。
警告
当使用 DST (夏令时) 更改之后的时区时,接近更改发生时的存储区的大小可能会与相邻存储区的大小略有不同。例如,假设某个夏令时开始于 CET 时区:2016 年 3 月 27 日凌晨 2 点,时钟被调到本地时间 1 小时到凌晨 3 点。如果聚合的结果是每日存储桶,则当天的存储桶将仅保留 23 小时的数据,而不是其他存储桶通常的 24 小时。对于较短的时间间隔 (例如 12 小时在这里,DST 轮换发生的 3 月 27 日上午,我们只有 11 小时的时段。
脚本#
像普通的 date_histogram
,同时支持文档级脚本和值级脚本。但是,此聚合不支持 min_doc_count
,extended_bounds
和 order
参数。
最小间隔参数#
minimum_interval
允许调用方指定应使用的最小舍入间隔。这可以使收集过程更有效率,因为聚合不会尝试以小于 minimum_interval
的任何时间间隔取整。
minimum_interval
的可接受单位为:
年
月
日
时
分
秒
POST /sales/_search?size=0 { "aggs" : { "sale_date" : { "auto_date_histogram" : { "field" : "date", "buckets": 10, "minimum_interval": "minute" } } } }
缺失值#
missing
参数定义应如何处理缺少值的文档。默认情况下,它们将被忽略,但也可以将它们视为具有值。
POST /sales/_search?size=0
{
"aggs" : {
"sale_date" : {
"auto_date_histogram" : {
"field" : "date",
"buckets": 10,
"missing": "2000/01/01"
}
}
}
}
- 在
publish_date
字段中没有值的文档将与值为2000-01-01
的文档归入同一存储桶。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。