其他分享
首页 > 其他分享> > ES按照时间分组,且可将时间字段“格式化”后再分组

ES按照时间分组,且可将时间字段“格式化”后再分组

作者:互联网

需求:需要按照一个时间比如createTime进行分组,且只取精确到分钟后进行分组,例如createTime="2022-08-19 14:31:59",分组时按照createTime="2022-08-19 14:31"分组

解决方案

1、通过DateHistogramAggregationBuilder(用的都是ES提供的Java客户端语法来写的),直接看代码

// factoryIdGroup是别名,自己自定义,不受影响
DateHistogramAggregationBuilder factoryIdGroup = AggregationBuilders.dateHistogram("factoryIdGroup")
                .field("createTime").dateHistogramInterval(DateHistogramInterval.MINUTE).format("yyyy-MM-dd HH:mm")
                .order(BucketOrder.aggregation("_key", true));

简要说明:DateHistogramInterval.MINUTE有多种,此种表示按照分钟进行分组

public static final DateHistogramInterval SECOND = new DateHistogramInterval("1s"); // `按照秒`
public static final DateHistogramInterval MINUTE = new DateHistogramInterval("1m");// `按照分`
public static final DateHistogramInterval HOUR = new DateHistogramInterval("1h");// `按照小时`
public static final DateHistogramInterval DAY = new DateHistogramInterval("1d");// `按照日`
public static final DateHistogramInterval WEEK = new DateHistogramInterval("1w");// `按照周`
public static final DateHistogramInterval MONTH = new DateHistogramInterval("1M");// `按照月`
public static final DateHistogramInterval QUARTER = new DateHistogramInterval("1q");// `按照季度`
public static final DateHistogramInterval YEAR = new DateHistogramInterval("1y");// `按照年`

2、通过写脚本解决,使用ES的script,直接看代码

String scriptText = "LocalDateTime local = doc['createTime'].value.toLocalDateTime();String format = local.format(DateTimeFormatter.ofPattern('yyyy-MM-dd HH:mm'));
SimpleDateFormat simpleDateFormat = new SimpleDateFormat('yyyy-MM-dd HH:mm');return simpleDateFormat.parse(format).getTime();";
Script script = new Script(ScriptType.INLINE, "painless", scriptText, new HashMap<>(2));
TermsAggregationBuilder factoryIdGroup = AggregationBuilders.terms("factoryIdGroup").script(script)
        .field("createTime").size(1000).order(BucketOrder.aggregation("_key",true));

简要说明
1、createTime为时间类型,如下图,只有是date类型,才能如上面代码那样使用。
如图

2、doc['createTime'].value是获取createTime的数据,这个需要根据你的代码的上下文来,可能你重命名了,那就不能写作createTime了
3、doc['createTime'].value.toLocalDateTime(),toLocalDateTime()函数的由来,doc['createTime'].value返回的是JodaCompatibleZonedDateTime类型,我们通过
JodaCompatibleZonedDateTime官方说明文档就能看到它所能调用的函数了,如下图所示(注意下图左边的版本号,不同版本的ES支持的函数不同)。

标签:格式化,final,DateHistogramInterval,public,static,分组,new,createTime,ES
来源: https://www.cnblogs.com/szbm/p/16602231.html