Java 通过RestHighLevelClient 使用ES的date_histogram 根据年月日做统计
时间:2022-07-22
本文章向大家介绍Java 通过RestHighLevelClient 使用ES的date_histogram 根据年月日做统计,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
只写了后台,前端请求带上dateType给后台,后端返回封装了json字符串的map
GsonUtil.getJsonStringByObject()是封装的Gson.toJson的方法
前端接受解析结果 并设置echatrs参数 即可完成图表绘制
/**
* 消息趋势统计 dateType由前端传递 包括年月周
* 按年则统计过去12个月
* 按月则统计过去30天
* 按周则统计过去7天
**/
public Map<String, String> msgTrendCount(String dateType) {
//每个索引的时间field name 可能不同 根据索引设置
String rangeField = "messageSendTime";
//索引名
String index = EsIndexName.TG_MESSAGE.getIndexName();
return dateHistogram(rangeField, dateType, index);
}
private Map<String, String> dateHistogram(String rangeField, String dateType, String... indices) {
Map<String, String> map = new HashMap<>(4);
try {
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
String from;
//extended bounds参数
String boundsStart;
String boundsEnd;
String to = formatter.format(now);
String format = "yyyy-MM-dd";
//bounds的格式化类型需要和format相同
DateTimeFormatter boundsFormatter = DateTimeFormatter.ofPattern(format);
//间隔 年类型较为特殊
DateHistogramInterval interval = DateHistogramInterval.DAY;
switch (dateType) {
case "week": {
from = formatter.format(now.minusDays(6));
boundsStart = boundsFormatter.format(now.minusDays(6));
boundsEnd = boundsFormatter.format(now);
break;
}
case "year": {
from = formatter.format(now.minusMonths(11));
format = "yyyy-MM";
boundsFormatter = DateTimeFormatter.ofPattern(format);
interval = DateHistogramInterval.MONTH;
boundsStart = boundsFormatter.format(now.minusMonths(11));
boundsEnd = boundsFormatter.format(now);
break;
}
case "month":
default: {
from = formatter.format(now.minusDays(29));
boundsStart = boundsFormatter.format(now.minusDays(29));
boundsEnd = boundsFormatter.format(now);
break;
}
}
//范围查询
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.rangeQuery(rangeField).from(from).to(to));
//dateHistogram
AggregationBuilder aggregationBuilder = AggregationBuilders.dateHistogram("dateHistogram")//自定义名称
.dateHistogramInterval(interval)//设置间隔
.minDocCount(0)//返回空桶
.field(rangeField)//指定时间字段
.format(format)//设定返回格式
.extendedBounds(new ExtendedBounds(boundsStart, boundsEnd));//设定范围
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//指定size为0 不返回文档 因为只需要数量
searchSourceBuilder.query(boolQueryBuilder).aggregation(aggregationBuilder).size(0);
SearchRequest searchRequest = new SearchRequest();
searchRequest.source(searchSourceBuilder);
searchRequest.indices(indices);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
Aggregation agg = searchResponse.getAggregations().get("dateHistogram");
List<? extends Histogram.Bucket> buckets = ((Histogram) agg).getBuckets();
List<String> dateList = new ArrayList<>(30);
List<String> countList = new ArrayList<>(30);
for (Histogram.Bucket bucket : buckets) {
// maybe:如果不是年 则将key中的年份去掉
dateList.add(bucket.getKeyAsString());
countList.add(String.valueOf(bucket.getDocCount()));
}
map.put("chartTime", GsonUtil.getJsonStringByObject(dateList));
map.put("chartCount", GsonUtil.getJsonStringByObject(countList));
} catch (Exception e) {
log.error("统计日期直方图出错:" + e.getMessage());
}
return map;
}
之前费劲写的好多代码来做这个统计,分别用日期去一天天的查数量,最近学习了解了es自带的 date_histogram
完全契合需求,遂将原笨拙的代码删除改为es的自带聚合 (果然人还是要多读书呀。。。)
速度上目前文档数量不大,没有差别,但预计随着后期文档数量增加,肯定是es的聚合更加高效。
- [Golang软件推荐] Frp内网穿透
- [Golang软件推荐] Golang通用连接池
- RxJS -- Subscription
- ASP.Net Core项目在Mac上使用Entity Framework Core 2.0进行迁移可能会遇到的一个问题.
- RxJS速成 (下)
- RxJS速成 (上)
- Typescript 查缺补漏
- Git -- Stash
- Git -- Rebase
- Git -- 分支与合并 (命令行+可视化工具p4merge) Fast Forward 合并禁用 Fast Forward 合并自动合并解决合并的冲突
- 使用Angular CLI进行单元测试和E2E测试
- Git - 使用命令和P4Merge进行diff
- 使用Angular CLI进行Build (构建) 和 Serve
- 使用Angular CLI生成路由
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 基于OpenCV实现海岸线变化检测
- 爬取bilibili再也不用头疼了,bilibili-api一步到位!
- 「React」很多人在滥用 state
- == 与equals和hashCode与equals
- 算法集锦(10)| 自动驾驶、机器人 | 物品图像动态检测算法实现
- Hystrix仪表盘
- Centos7 Nginx的SSL证书安装
- 算法集锦(11)| 自动驾驶 | 基于HOG和SVM的车辆识别算法
- 剑指offer(一):找出数组中重复的数字
- 剑指offer(二):不修改数组找出重复的数字
- 漫画:什么是树状数组?
- poiAndEasyExcel学习(五)
- 两分钟真能搞懂桶排序
- SpringMVC文件上传下载
- 学弟不懂原码反码补码,气的我给女朋友讲了一夜