Es中时间聚合date_histogram数据不全的问题

问题描述:

想要统计一天中每个小时的数据,
在没有数据且前面的时间里没有数据的统计数据拿不到,
比如Es中存在6点到20点的数据,直接使用Es中date_histogram指定calendar_interval为1h,得到的数据只有6点到20点的。
如下图Es的search:

POST /logs/_search
{   
    "size": 0, 
    "aggs" : {
        "sales_over_time" : {
            "date_histogram" : {
                "field" : "time",
                "calendar_interval" : "1h",
                "min_doc_count": 0,
  			  }
            }
        }
    }
}

es返回,只能拿到开始有数据的时间,到最后有数据的时间
而不是我想想要的每个小时都有数据

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "sales_over_time" : {
      "buckets" : [
        {
          "key_as_string" : "2022-01-26T10:00:00.000Z",
          "key" : 1643191200000,
          "doc_count" : 3
        },
        {
          "key_as_string" : "2022-01-26T11:00:00.000Z",
          "key" : 1643194800000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T12:00:00.000Z",
          "key" : 1643198400000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T13:00:00.000Z",
          "key" : 1643202000000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T14:00:00.000Z",
          "key" : 1643205600000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T15:00:00.000Z",
          "key" : 1643209200000,
          "doc_count" : 2
        }
      ]
    }
  }
}

解决方法:

在时间聚合中加入 ,
“extended_bounds”: {
“min”: “time1”,
“max”: “time2”
}
其中的min/max可为时间字符串,
如 2022-01-26T00:00:00.000000 ,
也可以为时间戳,单位为毫秒,
如1643187600000,
即为2022-01-26 08:00:00
各编程语言的直接获取时间戳的精度不一样,
如Java中获取时间戳单位到毫秒,
python中获取时间戳只到秒,注意单位。
建议使用符合格式的时间字符串。
代码实例:

POST /logs/_search
{   
   //已经在限制了时间范围为2022年1月26日	
    ...
    "size": 0, 
    "aggs" : {
        "sales_over_time" : {
            "date_histogram" : {
                "field" : "time",
                "calendar_interval" : "1h",
                "min_doc_count": 0,
                 "extended_bounds": {
        "min": "2022-01-26T00:00:00.000000",
        "max": "2022-01-26T23:59:00.000000"
    }
            }
        }
    }
}

//得到的结果

{
   ...
  "aggregations" : {
    "sales_over_time" : {
      "buckets" : [
        {
          "key_as_string" : "2022-01-26T00:00:00.000Z",
          "key" : 1643155200000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T01:00:00.000Z",
          "key" : 1643158800000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T02:00:00.000Z",
          "key" : 1643162400000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T03:00:00.000Z",
          "key" : 1643166000000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T04:00:00.000Z",
          "key" : 1643169600000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T05:00:00.000Z",
          "key" : 1643173200000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T06:00:00.000Z",
          "key" : 1643176800000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T07:00:00.000Z",
          "key" : 1643180400000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T08:00:00.000Z",
          "key" : 1643184000000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T09:00:00.000Z",
          "key" : 1643187600000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T10:00:00.000Z",
          "key" : 1643191200000,
          "doc_count" : 3
        },
        {
          "key_as_string" : "2022-01-26T11:00:00.000Z",
          "key" : 1643194800000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T12:00:00.000Z",
          "key" : 1643198400000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T13:00:00.000Z",
          "key" : 1643202000000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T14:00:00.000Z",
          "key" : 1643205600000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T15:00:00.000Z",
          "key" : 1643209200000,
          "doc_count" : 2
        },
        {
          "key_as_string" : "2022-01-26T16:00:00.000Z",
          "key" : 1643212800000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T17:00:00.000Z",
          "key" : 1643216400000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T18:00:00.000Z",
          "key" : 1643220000000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T19:00:00.000Z",
          "key" : 1643223600000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T20:00:00.000Z",
          "key" : 1643227200000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T21:00:00.000Z",
          "key" : 1643230800000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T22:00:00.000Z",
          "key" : 1643234400000,
          "doc_count" : 0
        },
        {
          "key_as_string" : "2022-01-26T23:00:00.000Z",
          "key" : 1643238000000,
          "doc_count" : 0
        }
      ]
    }
  }
}

PS
使用上述方案的时候,建议配合range限制时间范围,且和extended_bounds中的时间一致,
如果不一致的话,
例如range中限制时间范围为25日到26日两天的,extended_bounds中的时间仅仅写为26日的,
统计的数据则为25号第一条数据的那个小时到26号所有的小时数据。
如25号一条数据是8点30的,统计的数据则是从25号八点开始到26日结束的小时。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Date Histogram是一个在Elasticsearch使用的聚合方法,用于按照时间间隔对日期进行分组和计数。它类似于Histogram,但是支持日期表达式作为区间。 Date Histogram的用法相对于Histogram来说更加灵活,可以根据指定的日期表达式来对时间进行分组。例如,你可以将间隔(interval)指定为一个月,它会智能地知道2月比12月要短,并且还能根据时区进行定制,以便根据用户的时区来生成图形,而不是根据服务器的时区。 通常的Histogram桶也可以处理日期,但是它不具备自动识别日期并根据日期的特性进行处理的能力。而Date Histogram可以根据指定的时间间隔自动识别日期,并且能够合理地处理时区,这样就可以根据客户端的时区来进行图表的定制。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [date_histogram](https://blog.csdn.net/opera95/article/details/78614244)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [[Elasticsearch] 聚合 - 时间数据处理(Looking at Time)](https://blog.csdn.net/dm_vincent/article/details/42594043)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值