需求:需要按照一个时间比如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支持的函数不同)。