interval(时间间隔)的可用表达式:

  • year(1y)年
  • quarter(1q)季度
  • month(1M)月份
  • week(1w)星期
  • day(1d)天
  • hour(1h)小时
  • minute(1m)分钟
  • second(1s)秒
        // 查询
        "query": {
            "bool": {
                "must": [{
                    "range": {
                        "@timestamp": {
                            "gte": 1533556800000,
                            "lte": 1533806520000
        // 不显示具体的内容
        "size": 0,
        // 聚合
        "aggs": {
            // 自己取的聚合名字
            "group_by_grabTime": {
                // es提供的时间处理函数
                "date_histogram": {
                    // 需要聚合分组的字段名称, 类型需要为date, 格式没有要求
                    "field": "@timestamp",
                    // 按什么时间段聚合, 这里是5分钟, 可用的interval在上面给出
                    "interval": "5m",
                    // 设置时区, 这样就相当于东八区的时间
                    "time_zone":"+08:00",
                    // 返回值格式化,HH大写,不然不能区分上午、下午
                    "format": "yyyy-MM-dd HH",   
                    // 为空的话则填充0
                    "min_doc_count": 0,
                    // 需要填充0的范围
                    "extended_bounds": {
                        "min": 1533556800000,
                        "max": 1533806520000
                // 聚合
                "aggs": {
                    // 自己取的名称
                    "group_by_status": {
                        // es提供
                        "terms": {
                            // 聚合字段名
                            "field": "LowStatusOfPrice"
    "took": 960,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    "_clusters": {
        "total": 3,
        "successful": 3,
        "skipped": 0
    "hits": {
        "total": 13494821,
        "max_score": 0,
        "hits": []
    "aggregations": {
        "group_by_grabTime": {
            "buckets": [
                    "key_as_string": "2018-08-06 12",
                    "key": 1533556800000,
                    "doc_count": 25851,
                    "group_by_status": {
                        "doc_count_error_upper_bound": 0,
                        "sum_other_doc_count": 0,
                        "buckets": [ { "key": "2", "doc_count": 10804 }, { "key": "1", "doc_count": 7240 }, { "key": "4", "doc_count": 6716 }, { "key": "3", "doc_count": 1091 } ] }
                    "key_as_string": "2018-08-06 13",
                    "key": 1533562200000,
                    "doc_count": 25282,
                    "group_by_status": {
                        "doc_count_error_upper_bound": 0,
                        "sum_other_doc_count": 0,
                        "buckets": [ { "key": "2", "doc_count": 10457 }, { "key": "1", "doc_count": 7185 }, { "key": "4", "doc_count": 6696 }, { "key": "3", "doc_count": 944 } ] }
                .....
            "buckets": [
                    "key_as_string": "2018-08-06 12",
                    "key": 1533556800000,

1.关于统计的时间段
2018-08-06 12 统计的是12~13点之间的数据
以此类推
2018-08-06 00 统计的是00~01之间的数据
2018-08-06 23 统计的是23~次日00之间的数据

2.关于key 和 key_as_string
key_as_string 不一定完全可信, 即key按照用户当前时间格式化之后不一定等于key_as_string
这是由建立es索引时采用的时区决定的, 用之前最好验证一下, 比如说博主现在正在做的一个项目中, 由于es采用的是ISO8859-1的时间格式, 导致所有时区提前了8个小时, 所以在查询和统计时, 一定要记得补偿这8个小时的数据
可以通过设置时区来解决这个问题

从广义上讲,我们可以将 聚合 分为两种类型:父 聚合 (parent aggregation)和兄弟 聚合 (sibling aggregation)。你可能会发现它们有点令人困惑,所以让我们看看它们是什么以及如何使用它们。 按 时间 统计 如果搜索是在 Elasticsearch 中使用频率最高的,那么构建按 时间 统计的 date _ histogram 紧随其后。 为什么你会想用 date _ histogram 呢? 假设你的数据带 时间 戳。 无论是什么数据(Apache 事件日志、股票买卖交易 时间 、棒球运动 时间 )只要带有 时间 戳都可以进行 date _ histogram 分析。当你的数据有 时间 戳,你总是想在 时间 维度上构建指... 此处来简单 学习 一下 ` elasticsearch ` 的 ` date _ histogram `直方图 聚合 。它和普通的直方图` histogram ` 聚合 差不多,但是` date _ histogram `只可于 `日期或日期范围` 类型的值一起使用。 一 聚合 分析之 bucket( 分组 )&meteric(统计) 这一节内容主要是介绍下 bucket( 分组 )的概念 以及 meteric( 聚合 统计)概念,其实我们做过开发写过sql的就很容易理解了。然后我们结合案例进行练习和体会不同的bucket,以及不同的meteric,强化我们对 分组 聚合 统计的理解和记忆。 1.1 原理 bucket( 分组 )与metric( 聚合 group Date 聚合 是作为 aggregations 字段的一部分被返回的,每一个 key 都与 分组 条件对应,我这里是根据1.5小时 分组 ,key 将会显示 分组 时间 ,doc_count 字段,将会告诉我们包含此项的文档数量。此处使用按天 分组 ,可用的 时间 间隔表达式:year, quarter, month, week, day, hour, minute, second(年份、季度、月、周、日、小时、分钟、秒)。此处也可以根据小时 分组 ,1.5h则用分钟来表示(90m)// 声明where 条件。... 专用于日期值的范围 聚合 。此 聚合 与常规范围 聚合 的主要区别在于,from和to值可以用日期数学表达式表示,还可以指定一种日期格式,通过该格式返回from和to响应字段。请注意,此 聚合 包括每个范围的from值,不包括to值。 目录1. 聚集查询2. 指标聚集2.1 平均值聚集2.1.1 avg 聚集2.2 计数聚集与极值聚集2.2.1 计数聚集2.2.2 极值聚集2.3 统计聚集2.3.1 stats 聚集2.3.2 extended_stats 聚集 文中使用的数据可以参考 Elasticsearch 数据检索和分析导入数据相关内容 1. 聚集查询 聚集查询(Aggregation)提供了针对多条文档的统计运算功能,它不是针对文档本身内容的检索,而是要将它们 聚合 到一起运算某些方面的特征值。 聚集查询与 SQL 语言中的聚集 PS→无奈:拥有梦想只是一种智力,实现梦想才是一种能力。 空闲之余就把先前做过的一个通过 ElasticSearch 聚合 来实现查询当月实际签到的天数记录一下,纯留下点记忆,大家勿喷。 1.如果不了解elsticsearch 聚合 的概念可以自行网上查看一番,起码懂得概念以及使用方法。 我们的业务是需要查看某个人某个月的签到天数,不管一天签到多少次,只计算一次。根据签到天数计算获取的补贴数据入库。