ES 聚合查询Java Api

分页查询,按照时间进行分组查询求平均(多平均),按照某一字段分组求聚合等等

  1. 分页查询
        SysUser loginUser = SecurityUtils.getLoginUser().getUser();Long userId = loginUser.getUserId();LambdaQueryChainWrapper<Warning> query = warningService.lambdaQuery();if (req.getStatus()!=null && req.getStatus().size() > 0){if (req.getStatus().contains(null)){throw new BaseException("错误的'处理状态'字段信息!");}else {query.in(Warning::getProcessStatus, req.getStatus());}}//query.in(req.getStatus()!=null && req.getStatus().size() > 0,Warning::getProcessStatus, req.getStatus());query.eq(StringUtils.isNotEmpty(req.getSiteId()), Warning::getDeptId, req.getSiteId());query.like(StringUtils.isNotEmpty(req.getDevCode()), Warning::getDevCode, req.getDevCode());query.like(StringUtils.isNotEmpty(req.getDevName()), Warning::getDevName, req.getDevName());List<WarningProcess> processes = warningProcessService.getWarningProcess(userId);if (processes == null || processes.size() == 0)// return new TableDataInfo();//没有处理人的话,就按照当前登录人的站点权限过滤{List<Long> userDepts = userService.queryUserDepts(userId);query.in(Warning::getDeptId, userDepts);}else{List<Long> warnIds = processes.stream().map(m -> m.getWarnId()).collect(Collectors.toList());query.in(CollectionUtils.isNotEmpty(warnIds), Warning::getId, warnIds);}query.orderByDesc(Warning::getWarnTime);TableDataInfo data = warningService.page(req, query);List<SysDept> depts = sysDeptService.list();data.getRows().stream().forEach(item -> {Warning warnItem = (Warning) item;SysDept dept = depts.stream().filter(m -> m.getDeptId().equals(warnItem.getDeptId())).findFirst().orElse(null);if (null != dept) {warnItem.setDeptName(dept.getDeptName());}});return data;

mybatisPlus 转换成es查询的JavaApi

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()//从哪到哪.from((req.getPageNum() - 1) * req.getPageSize())//数量.size(req.getPageSize())//按照warn_time 倒序排序.sort("warn_time", SortOrder.DESC).trackTotalHits(true);BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();//相当于sql 的 in 操作if (req.getStatus()!=null && req.getStatus().size() > 0){boolQueryBuilder.filter(QueryBuilders.termsQuery("process_status",req.getStatus()));}//term 精确匹配if (StringUtils.isNotEmpty(req.getSiteId())){boolQueryBuilder.filter(QueryBuilders.termQuery("dept_id",req.getSiteId()));}//模糊查询if (StringUtils.isNotEmpty(req.getDevCode())){boolQueryBuilder.filter(QueryBuilders.wildcardQuery("dev_code.keyword","*"+req.getDevCode()+"*"));}if (StringUtils.isNotEmpty(req.getDevName())){boolQueryBuilder.filter(QueryBuilders.wildcardQuery("dev_name.keyword","*"+req.getDevName()+"*"));}List<WarningProcess> processes = warningProcessService.getWarningProcess(userId);if (processes == null || processes.size() == 0)// return new TableDataInfo();//没有处理人的话,就按照当前登录人的站点权限过滤{List<Long> userDepts = userService.queryUserDepts(userId);boolQueryBuilder.filter(QueryBuilders.termsQuery("dept_id.keyword",userDepts));}else{List<Long> warnIds = processes.stream().map(m -> m.getWarnId()).collect(Collectors.toList());if (CollectionUtils.isNotEmpty(warnIds)){//ES in操作 termsQueryboolQueryBuilder.filter(QueryBuilders.termsQuery("id",warnIds));}}//进行查询searchSourceBuilder.query(boolQueryBuilder);//返回结果SearchResponse searchResponse = EsClintUtil.execSearch(restHighLevelClient,searchSourceBuilder, index);//返回总数long total = searchResponse.getHits().getTotalHits();List<Warning> list = new ArrayList<>();final SearchHit[] searchHits = searchResponse.getHits().getHits();for (SearchHit searchHit : searchHits) {list.add(JSON.parseObject(searchHit.getSourceAsString(), Warning.class));}//返回自定义表格信息TableDataInfo info = new TableDataInfo(list, (int) total);
  1. 桶聚合
SELECT
dept_name,
count(d1.id) as imgcount,
count(distinct d1.device_code) as imgcount1,
sum(case d1.`status` when '1' then 1 ELSE 0 END) as warningCount
FROM   sys_dept s1
LEFT JOIN dev_shock_data d1 ON s1.dept_id = d1.dept_id
where s1.dept_id!=100
GROUP BY s1.dept_name

数据库的sql对应的Java代码

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.mustNot(QueryBuilders.termQuery("dept_id", 100));searchSourceBuilder.query(boolQueryBuilder);searchSourceBuilder.size(0);//不输出原始数据//按照站点分组TermsAggregationBuilder aggregationBuilder = AggregationBuilders.terms("deptgroup").field("dept_id")  //桶分组.subAggregation(AggregationBuilders.terms("statusgroup").field("status.keyword"))//设备个数去重数量.subAggregation(AggregationBuilders.cardinality("imgcount1").field("device_code.keyword")).size(5000);searchSourceBuilder.aggregation(aggregationBuilder);SearchResponse searchResponse = EsClintUtil.execSearch(restHighLevelClient,searchSourceBuilder, "dev_shock_data");// 遍历封装列表对象List<ImageStatisticRes> resList=new ArrayList<>();Terms parsedStringTerms =searchResponse.getAggregations().get("deptgroup");List<? extends Terms.Bucket> buckets = parsedStringTerms.getBuckets();Map<String,String> deptMap= EsClintUtil.getDepts(restHighLevelClient);List<String> list = new ArrayList<>();for (Terms.Bucket bucket : buckets) {//key的数据String key = bucket.getKey().toString();long docCount = bucket.getDocCount();//获取数据ImageStatisticRes res = new ImageStatisticRes();res.setSiteName(deptMap.get(key));res.setImageCount((int) docCount);//获取设备个数Cardinality imagecount1 = bucket.getAggregations().get("imgcount1");res.setImageCount1((int) imagecount1.getValue());Terms statusgroupTearms = bucket.getAggregations().get("statusgroup");for (Terms.Bucket statusBucket : statusgroupTearms.getBuckets()) {if (statusBucket.getKey().equals("1")) {res.setImageWarningCount((int) statusBucket.getDocCount());}}resList.add(res);list.add(key);}//获取到总的站台数据final List<String> deptIds = deptMap.keySet().stream().collect(Collectors.toList());//获取差集final List<String> collect = deptIds.stream().filter(item -> !list.contains(item)).collect(Collectors.toList());//遍历得到的差集就是不存在站台数据的for (String s : collect) {ImageStatisticRes res = new ImageStatisticRes();res.setSiteName(deptMap.get(s));res.setImageCount(0);res.setImageWarningCount(0);resList.add(res);}return resList;
  1. 时间聚合分组
SELECT HOUR (create_time) khour ,avg(angle_x) averageX,  avg(angle_y) averageY, avg(angle_z) averageZ  from dev_shock_datawhere device_id=#{deviceId} and create_time &gt;#{startTime} and  create_time &lt;#{endTime}group by HOUR (create_time)order by khour

数据库的sql转换成es对应的JavaApi

final ArrayList<GroupByHour> groupByHours = new ArrayList<>();SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().sort("create_time", SortOrder.ASC).trackTotalHits(true);BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.must(QueryBuilders.termQuery("device_id",deviceId));boolQueryBuilder.filter(QueryBuilders.rangeQuery("create_time").gt(startTime).lt(endTime));searchSourceBuilder.size(0);searchSourceBuilder.query(boolQueryBuilder);AvgAggregationBuilder  averageX = AggregationBuilders.avg("averageX").field(x);AvgAggregationBuilder  averageY = AggregationBuilders.avg("averageY").field(y);AvgAggregationBuilder  averageZ = AggregationBuilders.avg("averageZ").field(z);AggregationBuilder  groupTime = AggregationBuilders.dateHistogram("khour").field("create_time") // 根据date字段值,对数据进行分组// 时间分组间隔:DateHistogramInterval.* 序列常量,支持每月,每年,每天等等时间间隔.dateHistogramInterval(DateHistogramInterval.HOUR)// 设置返回结果中桶key的时间格式.format("HH")
//              .timeZone(DateTimeZone.forTimeZone(TimeZone.getTimeZone("GMT%2B8")))
//              .timeZone(DateTimeZone.forTimeZone(TimeZone.getTimeZone("GMT+8:00"))).minDocCount(0L).subAggregation(averageX).subAggregation(averageY).subAggregation(averageZ);searchSourceBuilder.aggregation(groupTime);final SearchResponse dev_shock_data = EsClintUtil.execSearch(restHighLevelClient, searchSourceBuilder, "dev_shock_data");ParsedDateHistogram khour = dev_shock_data.getAggregations().get("khour");final List<? extends Histogram.Bucket> buckets1 = khour.getBuckets();for (Histogram.Bucket bucket : buckets1) {final GroupByHour groupByHour = new GroupByHour();if(bucket.getDocCount()>0){groupByHour.setHour(Integer.parseInt(bucket.getKeyAsString()));Avg xAvg = bucket.getAggregations().get("averageX");Avg yAvg = bucket.getAggregations().get("averageY");Avg zAvg = bucket.getAggregations().get("averageZ");groupByHour.setAverageX(xAvg.getValue());groupByHour.setAverageY(yAvg.getValue());groupByHour.setAverageZ(zAvg.getValue());groupByHours.add(groupByHour);}}return groupByHours;

欢迎大家前来提需求!

ElasticSearch 聚合查询 JavaApi相关推荐

  1. Elasticsearch聚合查询案例分享

    为什么80%的码农都做不了架构师?>>>    Elasticsearch聚合查询案例分享 1.案例介绍 本文包含三个案例: 案例1:统计特定时间范围内每个应用的总访问量.访问成功数 ...

  2. php聚合查询,php elasticsearch 聚合查询(Aggregation)

    Elasticsearch中的聚合查询,类似SQL的SUM/AVG/COUNT/GROUP BY分组查询,主要用于统计分析场景. 这里主要介绍PHP Elasticsearch 聚合查询的写法,如果不 ...

  3. es7.1聚合查询 javaAPI

    es7.1聚合查询 javaAPI(一) 文章目录 es7.1聚合查询 javaAPI(一) 1. 查询符合条件的数据量 2. 查询某字段去重后的数据量 3. 单字段分组聚合 4. 多字段聚合 链接: ...

  4. Elasticsearch聚合查询多字段设置权重

    Elasticsearch聚合查询多字段设置权重 背景 环境说明 script设置权重 小结 背景 实际应用中,可能会需要为为doc文档中某个字段的某些特定的值设置权重,影响排序.es提供了比较灵活的 ...

  5. ElasticSearch聚合查询返回结果buckets取值

    ElasticSearch聚合查询返回结果buckets取值 1.聚合查询如下: {"size":0,"query":{"bool":{&q ...

  6. ElasticSearch聚合查询Restful语法和JavaApi详解(基于ES7.6)

    本文收录于github和gitee ,里面有我完整的Java系列文章,学习或面试都可以看看 (一)概述 在前面关于ES的一系列文章中,已经介绍了ES的概念.常用操作.JavaAPI以及实际的一个小de ...

  7. es java api 查询_es聚合查询javaapi

    查询节气详情 package net.apishop.www.controller; import import import import import import import import i ...

  8. ES/ElasticSearch 聚合查询时报错:too_many_buckets_exception

    环境:ElasticSearch6.7 问题描述: {"error": {"root_cause": [],"type": "se ...

  9. (转)Elasticsearch 聚合查询、桶聚合、管道聚合及复合查询

    转自: https://blog.csdn.net/zx711166/article/details/81906881 聚合查询 聚合是一种基于查询条件对数据进行分桶.计算的方法. 聚合可以嵌套,由此 ...

最新文章

  1. 10.python网络编程(解决粘包问题 part 2)
  2. B/S项目结束,又是一个新的开始
  3. 1.12 接口(Interface)的定义和实现
  4. 如何通过递归找父节点或子节点详解
  5. 概述 Linux系统扫描技术及安全防范
  6. [2020多校A层12.1]树(倍增/单调栈/dfs栈)
  7. 数学趣题——求圆周率的近似值
  8. 利用Javascrip实现web窗体的打开和关闭后的刷新
  9. 28岁的李佳琪落户上海了
  10. .Net Discovery系列之三 深入理解.Net垃圾收集机制(上)
  11. Redis集群命令行部署工具
  12. 3dmax2020通道图怎么渲染
  13. Http状态代码指示
  14. 基于和风天气API开发的天气查询小工具(含源码)
  15. 计算机缺失程序怎么办,win7电脑缺失dll文件软件打不开怎么办
  16. Android开发高德地图定位中GPS坐标转换
  17. 【Matplotlib】学术论文黑白柱状图绘制
  18. Auto.js 实现钉钉实时抢红包
  19. 2021-06-01-《图解HTTP》笔记
  20. R语言和医学统计学系列(1):t检验

热门文章

  1. Unable to determine the relationship represented by navigation ‘XXX‘ of type ‘XXX‘.
  2. 工业机器人pallet指令_近30年现场一线工作者,讲述工业机器人应用案例集锦!...
  3. 百问网7天物联网记录(二)
  4. Pandas学习笔记(二)—— Pandas索引
  5. 学计算机要选什么科,计算机要学什么科目
  6. 专家鼓励住房、汽车等大宗商品消费
  7. 本轮大宗商品涨价:(背后原因分析)2021-09
  8. logo设计的30种技巧
  9. 贷还是不贷:如何用 Python 和机器学习帮你决策?
  10. 21、ESP12E Motor Shield 电机驱动板使用