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  220120143442CB4C
                                        return 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")的取值

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023_“数维杯”问题B:棉秸秆热解的催化反应-详细解析含代码

题目翻译&#xff1a; 随着全球对可再生能源需求的不断增加&#xff0c;生物质能作为一种成熟的可再生能源得到了广泛的关注。棉花秸秆作为一种农业废弃物&#xff0c;因其丰富的纤维素、木质素等生物质成分而被视为重要的生物质资源。虽然棉花秸秆的热解可以产生各种形式的可…

机器视觉选型-什么时候用远心镜头

物体厚 当被检测物体厚度较大&#xff0c;需要检测不止一个平面时&#xff0c;典型应用如食品盒&#xff0c;饮料瓶等。 物体位置变化 当被测物体的摆放位置不确定&#xff0c;可能跟镜头成一定角度时。 物体上下跳动 当被测物体在被检测过程中上下跳动&#xff0c;如生产线上下…

初学编程学习,计算机编程怎么自学,中文编程工具下载

初学编程学习&#xff0c;计算机编程怎么自学&#xff0c;中文编程工具下载 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c;象如…

MySQL优化(2):索引与优化原理(上)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 上一篇&#xff0c;我们…

CF1899C Yarik and Array(DP,贪心)

题目链接 题目 A subarray is a continuous part of array. Yarik recently found an array a of n elements and became very interested in finding the maximum sum of a non empty subarray. However, Yarik doesn’t like consecutive integers with the same parity, s…

VS 将 localhost访问改为ip访问

项目场景&#xff1a; 使用vs进行本地调试时需要多人访问界面,使用ip访问报错 问题描述 vs通过ip访问报错 虚拟机或其它电脑不能正常打开 原因分析&#xff1a; 原因是vs访问规则默认是iis,固定默认启动地址是localhost 解决方案&#xff1a; 1.vs项目启动之后会出现这个 右…

【mysql】1153 - Got a packet bigger than ‘max_allowed_packet‘ bytes

执行mysql 语句出现&#xff1a;1153 - Got a packet bigger than max_allowed_packet bytes&#xff1b; 1153-得到一个大于“max_allowed_packet”字节的数据包。 数据包太大了怎么办。该配置吧。 查看max_allowed_packet show global variables like max_allowed_packet;…

js-webApi 笔记2之DOM事件

目录 1、表单事件 2、键盘事件 3、事件对象 4、排他思想 5、事件流 6、捕获和冒泡 7、阻止默认和冒泡 8、事件委托 9、事件解绑 10、窗口加载事件 11、窗口尺寸事件 12、元素尺寸和位置 13、窗口滚动事件 14、日期对象 15、节点 16、鼠标移入事件 1、表单事件 获取…

【云服务器选型指南:五大关键】

云服务器选型指南 写在前面 在云计算时代&#xff0c;云服务器&#xff08;Elastic Compute Service, ECS&#xff09;凭借其简单高效、安全可靠、处理能力可弹性伸缩等特点&#xff0c;成为构建稳定、安全应用的首选。相比物理服务器&#xff0c;云服务器的管理方式更为简单…

分类预测 | Matlab实现基于PSO-SDAE粒子群优化算法优化堆叠去噪自编码器的数据分类预测

分类预测 | Matlab实现基于PSO-SDAE粒子群优化算法优化堆叠去噪自编码器的数据分类预测 目录 分类预测 | Matlab实现基于PSO-SDAE粒子群优化算法优化堆叠去噪自编码器的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现基于PSO-SDAE粒子群优化算法…

【Coppeliasim】 通过TCP与coppeliasim通信

仿真客户端&#xff0c; 代码中启动了tcp服务器。 simrequiresim socketrequiresocket-- 以下函数将数据写入套接字&#xff08;仅为简单起见只处理单个数据包&#xff09;&#xff1a; writeSocketDatafunction(client,data)local headerstring.char(59,57,math.mod(#data,25…

【EI会议征稿】第七届大数据与应用统计国际学术研讨会(ISBDAS 2024)

第七届大数据与应用统计国际学术研讨会&#xff08;ISBDAS 2024&#xff09; 2024 7th International Symposium on Big Data and Applied Statistics 第七届大数据与应用统计国际学术研讨会&#xff08;ISBDAS 2024&#xff09;定于2024年3月8-10日在中国上海举行。会议旨在…

wpf devexpress Property Gird管理集合属性

Property Grid允许你添加&#xff0c;浏览和编辑集合属性

ESP32 MicroPython UART及小车类构造函数实验⑥

ESP32 MicroPython UART及小车类构造函数实验⑥ 1、实验目的2、实验内容3、参考代码4、实验结果 1、实验目的 控制小车动起来 2、实验内容 控制小车的前进、后退、左转、右转。读取小车 使用到的串口构造函数&#xff1a; uartmachine.UART(id,baudrate,rx,tx)uart:返回的构…

常见的反爬+文字加解密

一、常见的反爬介绍 基于身份识别的反爬&#xff1a;1.User-agent 2.Referer 3.Captcha 验证码 4.必备参数 基于爬虫行为的反爬&#xff1a;1.单位时间内请求数量超过一定阈值 2.相邻两次请求之间间隔小于一定阈值3.蜜罐陷阱 通过对数据加密进行反爬&#xff1a;1.对文字加密…

Elasticsearch:通过摄取管道加上嵌套向量对大型文档进行分块轻松地实现段落搜索

作者&#xff1a;VECTOR SEARCH 向量搜索是一种基于含义而不是精确或不精确的 token 匹配技术来搜索数据的强大方法。 然而&#xff0c;强大的向量搜索的文本嵌入模型只能按几个句子的顺序处理短文本段落&#xff0c;而不是可以处理任意大量文本的基于 BM25 的技术。 现在&…

Linux CentOS 8(DHCP的配置与管理)

Linux CentOS 8&#xff08;DHCP的配置与管理&#xff09; 目录 一、项目介绍二、DHCP服务简介三、DHCP工作原理四、配置DHCP服务4.1 项目配置准备4.2 dhcpd配置文件框架与参数说明4.3 登录客户机验证4.4 客户端IP地址的释放与重新申请4.5 保留特定IP地址 一、项目介绍 当计算…

使用Open3D库处理3D模型数据的实践指南

目录 引言 一、安装Open3D库 二、加载3D模型数据 三、处理3D模型数据 1、去除模型中的无效面 2、提取模型特征 四、存储处理后的3D模型数据 五、可视化处理后的3D模型数据 六、注意事项 结论 引言 在处理3D模型数据时&#xff0c;Open3D库是一个功能强大且易于使用的…

【Qt之QStandardItemModel】使用,tableview、listview、treeview设置模型

1. 引入 QStandardItemModel类提供了一个通用的模型&#xff0c;用于存储自定义数据。 以下是其用法&#xff1a;该类属于gui模块&#xff0c;因此在.pro中&#xff0c;需添加QT gui&#xff0c;如果已存在&#xff0c;则无需重复添加。 首先&#xff0c;引入头文件&#xff…

ARM 版 Kylin V10 部署 KubeSphere 3.4.0 不完全指南

前言 知识点 定级&#xff1a;入门级KubeKey 安装部署 ARM 版 KubeSphere 和 KubernetesARM 版麒麟 V10 安装部署 KubeSphere 和 Kubernetes 常见问题 实战服务器配置 (个人云上测试服务器) 主机名IPCPU内存系统盘数据盘用途ksp-master-1172.16.33.1681650200KubeSphere/k8…