想要统计一天中每个小时的数据,
在没有数据且前面的时间里没有数据的统计数据拿不到,
比如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日结束的小时。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)