跳到主要内容

日期直方图 date_histogram

Date Histogram Aggregation

这种多桶聚合类似于 Histogram Aggregation,但只能与日期值一起使用。这两个API的主要区别在于,这里可以使用日期/时间表达式指定间隔。

示例

请求一个月的时段间隔。

POST /sales/_search?size=0
{
"aggs" : {
"sales_over_time" : {
"date_histogram" : {
"field" : "date",
"interval" : "month"
}
}
}
}

您还可以使用时间单位分析支持的缩写来指定时间值。请注意,不支持分数时间值,但您可以通过转换到另一个时间单位(例如,可以将1.5h指定为90m)来解决此问题。

POST /sales/_search?size=0
{
"aggs" : {
"sales_over_time" : {
"date_histogram" : {
"field" : "date",
"interval" : "90m"
}
}
}
}

支持表达型日期格式模式

POST /sales/_search?size=0
{
"aggs" : {
"sales_over_time" : {
"date_histogram" : {
"field" : "date",
"interval" : "1M",
"format" : "yyyy-MM-dd"
}
}
}
}

Timezone

GET my_index/_search?size=0
{
"aggs": {
"by_day": {
"date_histogram": {
"field": "date",
"interval": "day",
"time_zone": "-01:00"
}
}
}
}

Offset

使用offset参数按指定的正(+)或负偏移(-)持续时间更改每个存储桶的起始值

PUT my_index/_doc/1?refresh
{
"date": "2015-10-01T05:30:00Z"
}

PUT my_index/_doc/2?refresh
{
"date": "2015-10-01T06:30:00Z"
}

GET my_index/_search?size=0
{
"aggs": {
"by_day": {
"date_histogram": {
"field": "date",
"interval": "day",
"offset": "+6h"
}
}
}
}

Keyed Response

将keyed标志设置为true会将一个唯一的字符串键与每个bucket相关联,并以哈希而非数组的形式返回范围:

POST /sales/_search?size=0
{
"aggs" : {
"sales_over_time" : {
"date_histogram" : {
"field" : "date",
"interval" : "1M",
"format" : "yyyy-MM-dd",
"keyed": true
}
}
}
}

返回

{
...
"aggregations": {
"sales_over_time": {
"buckets": {
"2015-01-01": {
"key_as_string": "2015-01-01",
"key": 1420070400000,
"doc_count": 3
},
"2015-02-01": {
"key_as_string": "2015-02-01",
"key": 1422748800000,
"doc_count": 2
},
"2015-03-01": {
"key_as_string": "2015-03-01",
"key": 1425168000000,
"doc_count": 2
}
}
}
}
}

Scripts

与普通直方图一样,支持 document-level scripts 和 value-level scripts。您可以使用order设置控制返回的桶的顺序,并根据min_doc_count设置过滤返回的桶(默认情况下,返回第一个与文档匹配的桶和最后一个桶之间的所有桶)。此直方图还支持extended_bounds设置,该设置允许将直方图的边界扩展到数据本身之外。

Missing value

POST /sales/_search?size=0
{
"aggs" : {
"sale_date" : {
"date_histogram" : {
"field" : "date",
"interval": "year",
"missing": "2000/01/01"
}
}
}
}

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

Order

默认情况下,返回的桶按关键字升序排序,但您可以使用顺序设置控制顺序。此设置支持与 Terms Aggregation相同的order功能。

使用脚本按星期几聚合

POST /sales/_search?size=0
{
"aggs": {
"dayOfWeek": {
"terms": {
"script": {
"lang": "painless",
"source": "doc['date'].value.dayOfWeekEnum.value"
}
}
}
}
}

返回

{
...
"aggregations": {
"dayOfWeek": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "7",
"doc_count": 4
},
{
"key": "4",
"doc_count": 3
}
]
}
}
}