ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-08-19 19:03:36  阅读:235  来源: 互联网

标签:格式化 final DateHistogramInterval public static 分组 new createTime 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有