ES聚合与分组查询取值参数含义(Java api版本)

一、说明

        在项目中使用Elasticsearch的聚合与分组查询后,对于返回结果一脸懵逼,查阅各资料后,自己总结了一下参数取值的含义,不一定全面,只含常见参数

二、分组查询

2.1 参数解释

SearchResponse<Map> searchResponse = null;try {searchResponse = client.search(s -> s.index("tbanalyzelist").query(q -> q.bool(t -> {t.must(m -> m.match(b -> b.field("machineType.keyword").query(FieldValue.of(machineType))));if (ToolUtil.isNotEmpty(bizCodes))t.must(m -> m.terms(b -> b.field("bizCode.keyword").terms(f -> f.value(values))));t.must(a -> a.range(r -> r.field("duration").gt(JsonData.of(0))));t.must(a -> a.range(r -> r.field("open_time").gt(JsonData.of(startTime)).lte(JsonData.of(endTime1))));return t;}))//.size(2000000) 数据太多暂且注释.from(1) //分页查询 起始位置.size(2) // 每页两条数据   .aggregations("byOpenTime", aggregationBuilder ->aggregationBuilder.terms(termsAggregationBuilder ->termsAggregationBuilder.field("openTime"))),Map.class);} catch (IOException e) {e.printStackTrace();}//查询结果System.out.println(searchResponse);System.out.println("耗时:" + searchResponse.took());HitsMetadata<Map> hits = searchResponse.hits();System.out.println(hits.total());System.out.println("符合条件的总文档数量:" + hits.total().value());//注意:第一个hits() 与 第二个hits()含义不一样List<Hit<Map>> hitList = searchResponse.hits().hits();  //获取分组结果Map<String, Aggregate> aggregations = searchResponse.aggregations();System.out.println("aggregations:" + aggregations);Aggregate aggregate = aggregations.get("byOpenTime");System.out.println("byOpenTime分组结果 = " + aggregate);LongTermsAggregate lterms = aggregate.lterms();Buckets<LongTermsBucket> buckets = lterms.buckets();for (LongTermsBucket b : buckets.array()) {System.out.println(b.key() + " : " + b.docCount());}
  •  searchResponse输出结果转JSON
{"took":190, //执行整个搜索请求耗费了多少毫秒"timed_out":false,//查询是否超时。默认情况下,搜索请求不会超时。"_shards":{ // 在查询中参与分片情况"failed":0,  //失败分片数量 "successful":1,//成功"total":1,//总计"skipped":0//跳过},"hits":{   //结果命中数据 "total":{ //匹配到的文档总数"relation":"gte",//是否是我们的实际的满足条件的所有文档数 "value":10000 //文档总数},"hits":[//每一个命中数据{"_index":"tbanalyzelist", //索引名相当于数据库的表名"_id":"QF2THIQBzxpesqmRtMpw","_score":3.0470734,//分数"_type":"_doc",//类型//资源,这里才是存储的我们想要的数据"_source":"{duration=317.0, //每个字段的值相当于mysql中的字段machineId=ZFB007422, bizName=wangyf, bizCode=221026172721ZBTQ, open_time=1664296386000, openTime=2022-09-27, machineType=DEV-HL}"},{"_index":"tbanalyzelist","_id":"QV2THIQBzxpesqmRtMpw","_score":3.0470734,"_type":"_doc","_source":"{duration=313.0, machineId=ZFB007422, bizName=wangyf, bizCode=221026172721ZBTQ, open_time=1664383009000, openTime=2022-09-28, machineType=DEV-HL}"}],"max_score":3.0470734 //查询所匹配文档的 _score 的最大值},"aggregations":{//聚合结果"lterms#byOpenTime":{//分组的桶名称"buckets":[ //分组桶结果{"doc_count":20144,//"key":"1664150400000","key_as_string":"2022-09-26T00:00:00.000Z"},{"doc_count":19724,"key":"1664409600000","key_as_string":"2022-09-29T00:00:00.000Z"},{"doc_count":19715,"key":"1664236800000","key_as_string":"2022-09-27T00:00:00.000Z"},{"doc_count":19653,"key":"1664323200000","key_as_string":"2022-09-28T00:00:00.000Z"},{"doc_count":19376,"key":"1664496000000","key_as_string":"2022-09-30T00:00:00.000Z"},{"doc_count":331,"key":"1664064000000","key_as_string":"2022-09-25T00:00:00.000Z"}],"doc_count_error_upper_bound":0,"sum_other_doc_count":0}}
}
  • doc_count_error_upper_bound:表示没有在这次聚合中返回、但是可能存在的潜在聚合结果,
  • sum_other_doc_count:表示这次聚合中没有统计到的文档数。因为ES为分布式部署,不同文档分散于多个分片,这样当聚合时,会在每个分片上分别聚合,然后由协调节点汇总结果后返回。
  • doc_count:每个桶的文档数量。
  • key: 分组后的key值

2.2 获取桶数据方式

Buckets<LongTermsBucket> longBuckets = aggregate.lterms().buckets();
Buckets<StringTermsBucket> stringBuckets = aggregate.sterms().buckets();
Buckets<DoubleTermsBucket> doubleBuckets = aggregate.dterms().buckets();

三、聚合查询

        查询条件先忽略,这里聚合后的条件可以直接取到max,count,min,avg,sum等值

        String cinemaId = "15989";SearchResponse<Map> searchResponse = null;try {searchResponse = client.search(s -> s.index("tbmaoyan").query(q -> q.bool(t -> {t.must(m -> m.match(f -> f.field("cinemaId.keyword").query(FieldValue.of(cinemaId))));//t.must(m -> m.term(f -> f.field("cinemaId.keyword").value(cinemaId)));//t.must(m -> m.match(f -> f.field("cinemaId").query("36924")));// t.must(m -> m.match(f -> f.field("bizCode").query(FieldValue.of("220104182434IIZF"))));//220104182434IIZF  220120143442CB4Creturn t;}))
//                           .sort(o -> o.field(f -> f.field("openTime").order(SortOrder.Asc)))//对viewInfo进行统计.aggregations("sumViewInfo", aggregationBuilder -> aggregationBuilder.stats(statsAggregationBuilder -> statsAggregationBuilder.field("viewInfo")))//对showInfo进行统计.aggregations("aggregateShowInfo", aggregationBuilder -> aggregationBuilder.stats(statsAggregationBuilder -> statsAggregationBuilder.field("showInfo"))).from(0).size(10000), Map.class);} catch (IOException e) {e.printStackTrace();}//查询结果System.out.println(searchResponse);System.out.println("耗时:" + searchResponse.took());HitsMetadata<Map> hits = searchResponse.hits();System.out.println(hits.total());System.out.println("符合条件的总文档数量:" + hits.total().value());//注意:第一个hits() 与 第二个hits()的区别List<Hit<Map>> hitList = searchResponse.hits().hits(); List<Map> hitListCopy = new ArrayList<>();for (Hit<Map> mapHit : hitList) {String source = mapHit.source().toString();System.out.println("文档原生信息:" + source);Map map = mapHit.source();hitListCopy.add(map);}//获取聚合结果Map<String, Aggregate> aggregations = searchResponse.aggregations();System.out.println("aggregations:" + aggregations);Aggregate aggregateViewInfo = aggregations.get("sumViewInfo");Aggregate aggregateShowInfo = aggregations.get("aggregateShowInfo");System.out.println("viewInfo:" + aggregateViewInfo);System.out.println("showInfo:" + aggregateShowInfo);System.out.println("统计个数:" + aggregateViewInfo.stats().count());System.out.println("最高分账票房:" + aggregateViewInfo.stats().max());System.out.println("最低分账票房:" + aggregateViewInfo.stats().min());System.out.println("平均分账票房:" + aggregateViewInfo.stats().avg());System.out.println("聚合查询的分账票房:" + aggregateViewInfo.stats().sum());Double sumViewInfoCopy = hitListCopy.stream().mapToDouble(h -> Double.parseDouble(h.get("viewInfo").toString())).sum();System.out.println("********************");System.out.println("聚合查询的分账票房:" + aggregateViewInfo.stats().sum());System.out.println("stream流查询的分账票房: " + sumViewInfoCopy);
  • searchResponse.aggregations()的结果跟上面分组查询类似,不过赘述了
  • aggregations.get("sumViewInfo")的取值

  •  aggregations.get("aggregateShowInfo")的取值

  •  比对一下聚合查询跟我们自己算的数据是否一致

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/146143.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

各机构如何加强网络渗透、“渗透”防御

数据渗透&#xff0c;例如黑客攻击和“渗透”&#xff0c;或未经授权的信息传输。 联邦调查局、国家安全局以及网络安全和基础设施安全局最近的联合报告证明&#xff0c;网络安全仍然是当今国防部门面临的两个最大的网络威胁。 所谓的零日攻击尤其有害&#xff0c;因为组织在…

pytorch单精度、半精度、混合精度、单卡、多卡(DP / DDP)、FSDP、DeepSpeed模型训练

pytorch单精度、半精度、混合精度、单卡、多卡&#xff08;DP / DDP&#xff09;、FSDP、DeepSpeed&#xff08;环境没搞起来&#xff09;模型训练代码&#xff0c;并对比不同方法的训练速度以及GPU内存的使用 代码&#xff1a;pytorch_model_train FairScale&#xff08;你真…

Apache阿帕奇安装配置

目录 一、下载程序 1. 点击Download 2. 点击Files for Microsoft Windows 3. 点击Apache Lounge 4. 点击httpd-2.4.54-win64-VSI6.zip ​5. 下载压缩包 6.解压到文件夹里 二、配置环境变量 1. 右键我的电脑 - 属性 2. 高级系统设置 3. 点击环境变量 4. 点击系统变…

瑞吉外卖Day06

1.用户地址 1.1实体类 /*** 地址簿*/ Data public class AddressBook implements Serializable {private static final long serialVersionUID 1L;private Long id;//用户idprivate Long userId;//收货人private String consignee;//手机号private String phone;//性别 0 女…

【蓝桥杯省赛真题01】C++水下探测器 第十届蓝桥杯中小学生创意编程大赛C++编程比赛省赛真题解析

目录 C/C++水下探测器 一、题目要求 1、编程实现 2、输入输出 二、算法分析

C++初阶:STL之string类

一.为什么学习string类&#xff1f; 在C语言中没有字符串这一数据类型&#xff0c;都是用字符数组来处理字符串&#xff0c;C也支持这种C风格的字符串。除此之外&#xff0c;C还提供了一种自定义数据类型--string&#xff0c;string是C标准模板库(STL)中的一个字符串类&#x…

大型语言模型中的幻觉研究综述:原理、分类、挑战和未决问题11.15+11.16+11.17

大型语言模型中的幻觉研究综述&#xff1a;原理、分类、挑战和未决问题11.15 摘要1 引言2 定义2.1 LLM2.3 大语言模型中的幻觉 3 幻觉的原因3.1 数据的幻觉3.1.1 有缺陷的数据源3.1.2 较差的数据利用率3.1.3 摘要 3.2 来自训练的幻觉3.2.1训练前的幻觉3.2.2来自对齐的幻觉3.2.3…

易点易动固定资产管理系统场景应用一:集成ERP/财务系统

在企业的日常运营中&#xff0c;固定资产管理是一个重要而繁琐的任务。传统的手工管理方式往往效率低下且容易出错&#xff0c;给企业带来不必要的成本和风险。为了解决这一问题&#xff0c;易点易动固定资产管理系统应运而生。本文将重点介绍易点易动固定资产管理系统在集成ER…

清理mac苹果电脑磁盘软件有哪些免费实用的?

苹果电脑是一款非常流行的操作系统设备&#xff0c;其稳定性和性能一直备受用户的喜爱。然而&#xff0c;随着时间的推移&#xff0c;我们使用电脑的过程中可能会发现磁盘上存储的数据越来越多&#xff0c;这不仅占用了宝贵的硬盘空间&#xff0c;还可能导致电脑运行变慢。因此…

微服务实战系列之Token

前言 什么是“Token”&#xff1f; 它是服务端生成的一串字符串&#xff0c;以作客户端进行请求的一个令牌&#xff0c;当第一次登录后&#xff0c;服务器生成一个Token便返回给客户端&#xff1b;以后客户端只携带此Token请求数据即可。 简言之&#xff0c;Token其实就是用户身…

数据结构与算法之美学习笔记:20 | 散列表(下):为什么散列表和链表经常会一起使用?

目录 前言LRU 缓存淘汰算法Redis 有序集合Java LinkedHashMap解答开篇 & 内容小结 前言 本节课程思维导图&#xff1a; 今天&#xff0c;我们就来看看&#xff0c;在这几个问题中&#xff0c;散列表和链表都是如何组合起来使用的&#xff0c;以及为什么散列表和链表会经常…

3ds Max渲染用专业显卡还是游戏显卡?

使用3dsmax建模时&#xff0c;会面临诸多选择&#xff0c;除了用vr还是cr的决策&#xff0c;硬件选择上也存在着疑问&#xff0c;比如用专业显卡还是消费级游戏显卡&#xff1f;一般来说&#xff0c;除非是特别专业的大型项目和软件&#xff0c;且预算在5位数以上&#xff0c;常…

Android Glide加载transform CenterCrop, CircleCrop ShapeableImageView圆形图并描边,Kotlin

Android Glide加载transform CenterCrop, CircleCrop ShapeableImageView圆形图并描边&#xff0c;Kotlin import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import com.bumptech.glide.load.resource.bitmap.CenterCrop import com.bumptech.glide.…

代码随想录算法训练营第二十五天| 216 组合总合 ||| 17 电话号码的字母组合

216 组合总和 ||| 暴力 class Solution {List<List<Integer>>res new ArrayList<>();List<Integer>newList new ArrayList<>();public List<List<Integer>> combinationSum3(int k, int n) {soluHelper(1,k,n,0);return res;}pr…

qt笔记之qml和C++的交互系列(一):初记

code review! —— 杭州 2023-11-16 夜 文章目录 一.qt笔记之qml和C的交互&#xff1a;官方文档阅读理解0.《Overview - QML and C Integration》中给出五种QML与C集成的方法1.Q_PROPERTY&#xff1a;将C类的成员变量暴露给QML2.Q_INVOKABLE()或public slots&#xff1a;将C类…

2024年山东省职业院校技能大赛中职组“网络安全”赛项竞赛试题-B

2024年山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题-B 一、竞赛时间 总计&#xff1a;360分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A、B模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略设置 A-3 流量完整性保护 A-4 …

探索arkui(2)--- 布局(列表)--- 2(支持分组/实现响应滚动位置)

前端开发布局是指前端开发人员宣布他们开发的新网站或应用程序正式上线的活动。在前端开发布局中&#xff0c;开发人员通常会展示新网站或应用程序的设计、功能和用户体验&#xff0c;并向公众宣传新产品的特点和优势。前端开发布局通常是前端开发领域的重要事件&#xff0c;吸…

MongoDB分片集群搭建

----前言 mongodb分片 一般用得比较少&#xff0c;需要较多的服务器&#xff0c;还有三种的角色 一般把mongodb的副本集应用得好就足够用了&#xff0c;可搭建多套mongodb复本集 mongodb分片技术 mongodb副本集可以解决数据备份、读性能的问题&#xff0c;但由于mongodb副本集是…

创作者焦点:Temple of Dum-Dum(试炼 3)

《Bomkus 博士的试炼》创作的幕后花絮。 《创作者焦点》系列共分为六部分&#xff0c;重点介绍《Bomkus 博士的试炼》的游戏创作过程及其独特的游戏功能。 Temple of Dum-Dum&#xff1a; Temple of Dum-Dum 是 Bomkus 博士试炼中的第三个挑战&#xff0c;该试炼由六项体验组成…

SecureCRT 9.4.2 for Mac

SecureCRT是一款由VanDyke Software公司开发的终端仿真软件&#xff0c;它提供了类似于Telnet和SSH等协议的远程访问功能。SecureCRT专门为网络管理员、系统管理员和其他需要保密访问网络设备的用户设计。 SecureCRT具有以下特点&#xff1a; 安全性&#xff1a;SecureCRT支持…