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

发表评论

邮箱地址不会被公开。 必填项已用*标注