ES中的时间粒度聚合
在ES查询语句中,在aggregations中,可以采用date_histogram作为查询方式
使用代码基本如下
“date_histogram”: {
“field”: “newtime”,
“time_zone”: “+08:00”,
“calendar_interval”: “1M”,
“offset”: 0,
“order”: {
“_key”: “asc”
},
“keyed”: false,
“min_doc_count”: 0,
“extended_bounds”: {
“min”: “2021-04-01T00:59:59.999+08:00”,
“max”: “2021-06-30T23:59:59.999+08:00”
}
}
如果转换为java代码则为
DateHistogramAggregationBuilder timeBuilder = AggregationBuilders.dateHistogram(AGG_TIME)
.field(“date”)
.timeZone(time.getStartTime().getOffset().normalized())
.calendar_iterval(DateHistogramInterval.Mouth)
.extendedBounds(new ExtendedBounds(time.getStartTime().toString(),time.getEndTime().toString()));
获取到结果为
这次主要踩得坑在于
查询语句中的
calendar_interval字段
一开始需求是支持查询 天 月 小时
即传入的calendar_interval为1d 1m 1h
没有问题,但是出现需求为诸如6小时 15分钟的时候,calendar_interval查询出现问题了
在查看了ES的官方文档后,发现如下
诸如 6d这样的参数在查询的时候会发生错误
但在官方文档上面,发现ES还推荐使用字段fixed_interval
fixed_interval支持倍数查询,在准备使用的时候,发现文档中有这么一段话
对于月份这种可能有31或30的不确定值,fixed_interval并不支持
所以最终进行了综合使用
使用枚举,来在其中包含一个DateHistogramAggregationBuilder,方便传入参数后build