Elasticsearch 中如何进行日期直方图聚合?

推荐答案

在 Elasticsearch 中,可以使用 date_histogram 聚合来对日期字段进行直方图聚合。以下是一个示例查询:

-- -------------------- ---- -------
-
  ------- --
  ------- -
    ------------------ -
      ----------------- -
        -------- -------
        -------------------- -------
      -
    -
  -
-

在这个示例中,date_histogram 聚合会对 date 字段按月进行分组,并返回每个月的文档数量。

本题详细解读

1. date_histogram 聚合的基本概念

date_histogram 聚合是一种基于日期字段的聚合操作,它将日期字段的值按照指定的时间间隔(如天、周、月等)进行分组,并返回每个时间间隔内的文档数量或其他聚合结果。

2. 关键参数解析

  • field: 指定要进行聚合的日期字段。在上面的示例中,fielddate

  • calendar_interval: 指定时间间隔的类型。常见的值包括:

    • year: 按年分组
    • quarter: 按季度分组
    • month: 按月分组
    • week: 按周分组
    • day: 按天分组
    • hour: 按小时分组
    • minute: 按分钟分组
    • second: 按秒分组

    你也可以使用 fixed_interval 来指定固定的时间间隔,例如 1d 表示一天。

3. 示例查询解析

在上面的示例查询中:

  • size: 0 表示不返回任何文档,只返回聚合结果。
  • aggs 是聚合的根节点。
  • sales_over_time 是聚合的名称,你可以根据需要自定义。
  • date_histogram 是聚合类型,表示我们要进行日期直方图聚合。
  • field: "date" 表示我们要对 date 字段进行聚合。
  • calendar_interval: "month" 表示我们按月进行分组。

4. 返回结果

执行上述查询后,Elasticsearch 会返回类似如下的结果:

-- -------------------- ---- -------
-
  --------------- -
    ------------------ -
      ---------- -
        -
          ---------------- ---------------------------
          ------ --------------
          ------------ ---
        --
        -
          ---------------- ---------------------------
          ------ --------------
          ------------ ---
        --
        ---
      -
    -
  -
-

每个 bucket 表示一个时间间隔内的聚合结果,key_as_string 是时间间隔的字符串表示,key 是时间戳,doc_count 是该时间间隔内的文档数量。

5. 其他可选参数

  • time_zone: 指定时区,例如 "time_zone": "+08:00"
  • format: 指定返回的时间格式,例如 "format": "yyyy-MM-dd"
  • min_doc_count: 指定每个 bucket 的最小文档数量,低于该值的 bucket 将被忽略。

通过这些参数,你可以更灵活地控制 date_histogram 聚合的行为。

纠错
反馈