date_histogram,es按照时间分组统计

日期直方图聚合(date_histogram)

与histogram相似,es中内部将日期表示为一个long值,所以有时候可以用histogram来达到相同的目的,但往往没有date_histogram那么精确

date_histogram的特点在于可以使用 日期/时间表达式指定间隔。

原本的interval在7.2中被弃用,更换为fixed_interval与calendar_interval

相关字段

calendar_interval

只支持单个日历单元,如:支持 1m 不支持 2m 1.5m

  • minute (1m)
  • hour(1h)
  • day(1d)
  • week(1w)
  • month(1m)
  • quarter( 季度 1q)
  • year(1y)

fixed_interval

固定间隔,SI单位i,永远不会偏离,

  • seconds (s) : 30s
  • hours (h) : 1.5h
  • days (d): 3d

time_zone

es的日期时间是以UTC存储的,默认情况下,所有的桶装和四舍五入也是在 UTC 中完成的。使用 time _ zone 参数指示 bucket 应使用不同的时区。

时区可以指定为 ISO 8601 UTC的偏移量,也可指定为 IANA 时区数据库中指定的时区 ID。如 "time_zone": "+08:00""time_zone": "Asia/Shanghai"

这里引用一个官方的例子:

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

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

不指定时区

GET my_index/_search?size=0
{
  "aggs": {
    "by_day": {
      "date_histogram": {
        "field":     "date",
        "calendar_interval":  "day"
      }
    }
  }
}

响应
{
  ...

  "aggregations": {
    "by_day": {
      "buckets": [
        {
          "key_as_string": "2015-10-01T00:00:00.000Z",
          "key":           1443657600000,
          "doc_count":     2
        }
      ]
    }
  }
}

如果指定的时区为”-01:00″,那么该时区的24点就是UTC23点

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

现在,第一个文档落入2015年9月30日的桶中,而第二个文档落入2015年10月1日的桶中:
{
  ...

  "aggregations": {
    "by_day": {
      "buckets": [
        {
        # key_as_string 值表示指定时区内每天的午夜。
          "key_as_string": "2015-09-30T00:00:00.000-01:00",
          "key": 1443574800000,
          "doc_count": 1
        },
        {
          "key_as_string": "2015-10-01T00:00:00.000-01:00",
          "key": 1443661200000,
          "doc_count": 1
        }
      ]
    }
  }
}

offset

使用偏移量参数根据指定的正偏移量(+)或负偏移量(-)持续时间更改每个 bucket 的开始值

比如一个index中现有两个文档,date属性分别为 2015.10.01 05:30:002015.10.01 06:30:00,使用如下参数,那么这两个文档会落入一桶中,即 2015-10-01 00:00:00的桶中

date_histogram,es按照时间分组统计
{
  "aggs": {
    "by_day": {
      "date_histogram": {
        "field":     "date",
        "calendar_interval":  "day"
      }
    }
  }
}

如果这时偏移量设置为+6h:

{
  ...

  "aggregations": {
    "by_day": {
      "buckets": [
        {
          "key_as_string": "2015-09-30T06:00:00.000Z",
          "key": 1443592800000,
          "doc_count": 1
        },
        {
          "key_as_string": "2015-10-01T06:00:00.000Z",
          "key": 1443679200000,
          "doc_count": 1
        }
      ]
    }
  }
}

extended_bounds

强制返回指定范围内的每一个桶,min与max都会被当做桶返回

Original: https://www.cnblogs.com/daydreamer-fs/p/16813648.html
Author: fogey
Title: date_histogram,es按照时间分组统计

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/713490/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球