当前位置: 首页 > news >正文

Elasticsearch的DSL查询,分组后排序,并查询组数量

Elasticsearch分组后,根据分组后的数量排序,并查询分组后的组数量,通过DSL和java API两种方式


解决方案:

示例:在单据表中,查询2022-01-19当天每个人提交的单据数量,从高到低排序,并查询提交过单据的总人数。

期望实现的SQL

select Id,count(Id) as c from userbill where type='bill' and createTime >='2022-01-19' 
and createTime <= '2022-01-19' group by createUser order by c desc

1、DSL方式 :

GET /userbill/_search
{"from": 0,"size": 0,"query": {"bool": {"filter": [{"bool": {"must": [{"term": {"type": {"value": "bill","boost": 1}}},{"range": {"createTime": {"from": "2022-01-19","to": "2022-01-19","include_lower": true,"include_upper": true,"boost": 1}}}],"adjust_pure_negative": true,"boost": 1}}]}},"_source": false,"stored_fields": "_none_","aggs": {"group_name": {"terms": {"field": "createUser","size": 999999},"aggs": {"bucket_field": {"bucket_sort": {"sort": [{"_count": {"order": "desc"}}]}}}},"stats_monthly_sales": {"stats_bucket": {"buckets_path": "group_name>_count"}}}
}

查询结果 

key为分组用户ID,doc_count为数量,stats_monthly_sales内count为组的数量

{"took" : 2,"timed_out" : false,"_shards" : {"total" : 5,"successful" : 5,"skipped" : 0,"failed" : 0},"hits" : {"total" : 32,"max_score" : 0.0,"hits" : [ ]},"aggregations" : {"group_name" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : 115944,"doc_count" : 8},{"key" : 967145,"doc_count" : 7},{"key" : 917175,"doc_count" : 4},{"key" : 937800,"doc_count" : 3},{"key" : 888831,"doc_count" : 2},{"key" : 963198,"doc_count" : 2},{"key" : 88896565,"doc_count" : 2},{"key" : 381480,"doc_count" : 1},{"key" : 918555,"doc_count" : 1},{"key" : 1002454,"doc_count" : 1},{"key" : 88895739,"doc_count" : 1}]},"stats_monthly_sales" : {"count" : 11,"min" : 1.0,"max" : 8.0,"avg" : 2.909090909090909,"sum" : 32.0}}
}

 2、java API方式

查询后解析结果,封装到List集合中

public List<StatisticsData> test(){SearchSourceBuilder builder = new SearchSourceBuilder();BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();boolQueryBuilder.must(QueryBuilders.termQuery("type", "bill"));boolQueryBuilder.must(QueryBuilders.rangeQuery("createTime").gte("2022-01-19").lte("2022-01-19"));queryBuilder.filter(boolQueryBuilder);builder.query(queryBuilder);TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("group_name").field("createUser").size(999999);builder.aggregation(new StatsBucketPipelineAggregationBuilder("stats_bucket", "group_name>_count"));builder.aggregation(termsAggregationBuilder);builder.from(0);builder.size(0);builder.fetchSource(false);SearchRequest request = new SearchRequest(ElasticsearchConstant.EMSUSERBILLPROCESS_INDEX);request.source(builder);SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);ParsedTerms parsedTerms = (ParsedTerms) response.getAggregations().asMap().get("group_name");List<Terms.Bucket> buckets = (List<Terms.Bucket>) parsedTerms.getBuckets();List<StatisticsData> li = buckets.stream().map(u -> {StatisticsData s = new StatisticsData();s.setKey(String.valueOf(u.getKey()));s.setDoc_count(String.valueOf(u.getDocCount()));return s;}).collect(Collectors.toList());return li;}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 学工系统学生家庭情况登记功能概述
  • NET的全称、主要功能以及在计算机网络中的作用?
  • 8.3 day bug
  • 快速方便地下载huggingface的模型库和数据集
  • MQTT(速记版)
  • Arduino PID库 (2) –微分导致的过冲
  • 基于ThinkPHP开发的校园跑腿社区小程序系统源码,包含前后端代码
  • css3的继承性
  • 十五 open CV 教程 形态学二值化和腐蚀操作
  • 结构型设计模式:桥接/组合/装饰/外观/享元
  • 【Nuxt】配置
  • 【Python 逆向滑块】(实战六)逆向滑块,并实现用Python+Node.js 生成滑块、识别滑块、验证滑块、发送短信
  • CTF web bibibi题型
  • Unity计算位置平移矩阵
  • 《Milvus Cloud向量数据库指南》——什么是高可用:深入理解数据库系统中的高可用性架构
  • 【391天】每日项目总结系列128(2018.03.03)
  • Android Studio:GIT提交项目到远程仓库
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • golang 发送GET和POST示例
  • Javascripit类型转换比较那点事儿,双等号(==)
  • mongo索引构建
  • PAT A1120
  • SQLServer之创建显式事务
  • Webpack 4x 之路 ( 四 )
  • zookeeper系列(七)实战分布式命名服务
  • 安卓应用性能调试和优化经验分享
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 二维平面内的碰撞检测【一】
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 在Mac OS X上安装 Ruby运行环境
  • 终端用户监控:真实用户监控还是模拟监控?
  • gunicorn工作原理
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • UI设计初学者应该如何入门?
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​io --- 处理流的核心工具​
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (Java入门)抽象类,接口,内部类
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (九)信息融合方式简介
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)程序员技术练级攻略
  • ***详解账号泄露:全球约1亿用户已泄露
  • .CSS-hover 的解释
  • .gitattributes 文件
  • .java 9 找不到符号_java找不到符号
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args