【Elasticsearch】 日期直方图聚合(`date_histogram`)

发布于:2025-02-10 ⋅ 阅读:(114) ⋅ 点赞:(0)

 日期直方图聚合(`date_histogram`)是 Elasticsearch 中一种非常强大的聚合功能,专门用于处理时间序列数据。它通过将时间轴划分为一系列等间隔的区间(桶),并对每个桶内的文档进行统计分析,从而帮助用户洞察数据的变化趋势、周期性规律以及异常情况。

 

 

1.基本概念

日期直方图聚合只能用于日期或日期范围类型的字段。它会根据指定的时间间隔(如分钟、小时、天等)将数据分组到不同的桶中,并统计每个桶中的文档数量。

 

 

2.参数说明

 

• `field`:指定要聚合的日期字段。

 

• `calendar_interval`:基于日历的时间间隔,如天、周、月等。这种间隔会考虑夏令时等因素。

 

• `fixed_interval`:固定的时间间隔,如每3小时或每10分钟。这种间隔不考虑日历变化。

 

• `time_zone`:指定时区,确保桶的划分基于特定的时区,而不是默认的 UTC。

 

• `min_doc_count`:指定最少包含的文档数量。如果某个桶中的文档数量小于该值,则该桶不会出现在结果中。

 

• `missing`:为缺失值指定一个默认值,这样即使某些文档中没有指定字段,它们也可以被包含在聚合中。

 

• `extended_bounds`:扩展桶的范围,即使某些时间间隔内没有数据,也会生成空桶。

 

• `offset`:对时间间隔进行偏移,例如将每天的统计时间从午夜偏移到上午10点。

 

 

3.计算桶键(Bucket Key)

桶键的计算公式为:

 

```

bucket_key = localToUtc(Math.floor(utcToLocal(value) / interval) * interval))

```

 

例如,对于时间`2022-11-29 23:59:59`,在时区`+08:00`下,以`1d`为单位聚合时,最终计算出的桶键为`2022-11-30 00:00:00`。

 

 

4.使用示例

以下是一个简单的日期直方图聚合查询示例,按天统计文档数量:

 

```json

POST /index_api_invoked_time/_search

{

  "size": 0,

  "aggregations": {

    "agg_01": {

      "date_histogram": {

        "field": "invoked_time",

        "calendar_interval": "1d",

        "min_doc_count": 0,

        "missing": "2022-11-27 23:59:59",

        "time_zone": "+08:00",

        "offset": "+10h",

        "extended_bounds": {

          "min": "2022-11-26 10:00:00",

          "max": "2022-12-03 10:00:00"

        }

      }

    }

  }

}

```

 

这个查询将按天统计`invoked_time`字段的文档数量,并且考虑了时区、偏移量和扩展边界。

 

 

5.优化建议

 

• 如果数据量很大,建议使用`min_doc_count`参数过滤掉文档数量较少的桶,以减少返回结果的数量,提高查询性能。

 

• 对于稀疏数据,使用`extended_bounds`参数可以确保即使某些时间间隔内没有数据,也会生成空桶。

 

通过日期直方图聚合,用户可以方便地对时间序列数据进行可视化和分析,从而更好地理解数据的变化趋势和规律。


网站公告

今日签到

点亮在社区的每一天
去签到