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

news2025/1/19 16:56:34

一、说明

        在项目中使用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")的取值

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

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

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

相关文章

CentOS中安装常用环境

一、CentOS安装 redis ①&#xff1a;更新yum sudo yum update②&#xff1a;安装 EPEL 存储库 Redis 通常位于 EPEL 存储库中。运行以下命令安装 EPEL 存储库 sudo yum install epel-release③&#xff1a;安装 Redis sudo yum install redis④&#xff1a;启动 Redis 服…

哪种猫罐头比较好?推荐给新手养猫的5款好口碑猫罐头!

新手养猫很容易陷入疯狂购买的模式&#xff0c;但有些品牌真的不能乱买&#xff01;现在的大环境不太好&#xff0c;我们需要学会控制自己的消费欲望&#xff0c;把钱花在刀刃上&#xff01;哪种猫罐头比较好&#xff1f;现在宠物市场真的很内卷&#xff0c;很多品牌都在比拼产…

SOLIDWORKS功能布局实用技巧之保存实体技术

在SOLIDWORKS软件中&#xff0c;有一些命令可以将一个或多个实体保存为独立的零件文件。然而&#xff0c;每个命令都具有不同的特性&#xff0c;有些命令的选项可以让您在保存多个零件时直接生成装配体文件。让我们来深入了解这些功能布局技巧&#xff0c;特别是实体保存技术。…

Moka人事:实现无代码开发的API连接,打通电商平台与用户运营系统

无代码开发的API连接&#xff1a;Moka人事的核心优势 Moka人事&#xff0c;是北京希瑞亚斯科技有限公司于2015年推出的一款数据驱动的智能化HR SaaS产品。这款产品的主要优势在于其无需进行API开发即可实现系统的连接和集成&#xff0c;这不仅大大提升了企业的工作效率&#x…

软件测试/测试开发丨掌握未来,引领人工智能测试新潮流!

点此领取人工智能课程 在数字化革命的浪潮中&#xff0c;人工智能软件成为企业创新和成功的关键推动力。为了在这个竞争激烈的市场中脱颖而出&#xff0c;精湛的人工智能软件测试技能变得至关重要。 ChatGPT应用实战&#xff1a; 学员将深入了解 ChatGPT 的实际应用&#xf…

【BIM入门实战】高程点无法放置的解决方法

文章目录 一、问题提出二、解决办法1. 检查模型图形样式2. 高程点可以放置的图元一、问题提出 在平面图中添加高程点时有时会遇到无法在楼板等平面构件上放置高程点,应如何设置才能使高程点正常放置? 如下图所示,楼板上无法放置高程点: 二、解决办法 1. 检查模型图形样式…

安防监控展示预约小程序的作用如何

监控在生活中的用途非常广泛&#xff0c;普遍应用于小区门户、商业大厦、产业基地、家庭、汽车等场景中&#xff0c;市场需求较大&#xff0c;同时随着科技发展&#xff0c;安防监控产品更新迭代也比较快&#xff0c;衍生出的经销店、安装技术工等产业近些年也比较火。 安防监…

C++初阶(十一)STL简介及string类初讲

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、什么是STL二、STL的版本三、STL的六大组件四、STL的重要性五、如何学习STL六、STL的缺陷七…

NewStarCTF2023 Week3 Reverse方向 题目STL WP

分析 代码不多&#xff0c;逻辑挺清楚的。 先用Z3解出V7&#xff1a; from z3 import *s Solver() v1, v2, v3, v4, v5, v6 BitVecs(v1 v2 v3 v4 v5 v6, 32) v7, v8, v9, v10, v11 BitVecs(v7 v8 v9 v10 v11, 32)s.add((v1 << 15) ^ v1 0x2882D802120E) s.add((v2 …

Vue工程化

目录 一、环境准备 npm 二、Vue整站使用 1、Vue项目创建和启动 区别 目录结构 启动 2、Vue开发流程 App.vue 快速入门 3、API风格 案例 细节注意 代码实现 测试 一、环境准备 介绍&#xff1a;create-vue是Vue官方提供的最新的脚手架工具&#xff0c;用于快速生…

工业除尘器笔记

工业除尘器用于对工业生产产生的有害气体和粉尘进行吸附。相关标准的制定最早可以追溯到1960年代以前。注意&#xff0c;本文的附录包含一起完整的工业除尘器事故的分析和定责过程。相关事故分析定责文档源头摘自上海市政府网站。 在产品设计行业和关联下游行业&#xff0c;在…

核心容器中bean的操作

bean配置 bean基础配置 bean别名配置 **注意事项&#xff1a;**获取bean无论是通过id还是name获取&#xff0c;如果无法获取到&#xff0c;将抛出异常NoSuchBeanDefinitionException&#xff08;NoSuchBeanDefinitionException&#xff1a;No bean named ‘bookServiceImpl’ …

15技术太卷我学APEX-curl请求apex的autoRest

0 curl概述 cURL无处不在。它几乎隐藏在所有设备中&#xff0c;例如汽车&#xff0c;蓝光播放器等。它通过互联网协议传输任意类型数据。 0.1 cURL是什么意思&#xff1f; cURL&#xff08;客户端URL&#xff09;是一个开放源代码的命令行工具&#xff0c;也是一个跨平台的库…

智慧工地AI视频管理平台源码

智慧工地是指以物联网、移动互联网技术为基础&#xff0c;充分应用人工智能等信息技术&#xff0c;通过AI赋能建筑行业&#xff0c;对住建项目内人员、车辆、安全、设备、材料等进行智能化管理&#xff0c;实现工地现场生产作业协调、智能处理和科学管理。智慧工地的核心是以一…

三子棋——C语言初阶

一.游戏思路&#xff1a; 设计菜单&#xff0c;选择开始游戏(1)还是退出游戏(0)&#xff08;若是输入数字不再输入范围内&#xff0c;则“选择错误”&#xff09;初始化棋盘打印棋盘&#xff08;步骤二和三不可调换位置&#xff09;玩家下棋&#xff08;坐标落子&#xff09;—…

php-cli

//运行index.php ./php index.php//启动php内置服务器 ./php -S 0.0.0.0:8080//启动内置服务在后台运行&#xff0c;日志输出到本目录下的server.log nohup ./php -S 0.0.0.0:8080 -t . > server.log 2>&1 &# 查找 PHP 进程 ps aux | grep "php -S 0.0.0.0:…

鸿蒙原生应用开发-折叠屏、平板设备服务卡片适配

一、多设备卡片适配原则 为不同尺寸的卡片提供不同的功能 在卡片开发过程中请考虑适配不同尺寸的设备&#xff0c;特别是在折叠屏和平板设备上&#xff0c;设备屏幕尺寸的变化直接影响了卡片内容的展示。请发挥想象力设计具有自适应能力的卡片&#xff0c;避免在卡片内容不做…

Java面试题(每天10题)-------连载(32)

目录 设计模式篇 1、工厂方法模式&#xff08;利用创建同一接口的不同实例&#xff09;&#xff1a; 2、抽象工厂模式&#xff08;多个工厂&#xff09; 3、单例模式&#xff08;保证对象只有一个实例&#xff09; 4、原型模式&#xff08;对一个原型进行复制、克隆产生类…

【Linux】gcc/g++ gdb 使用

目录 1&#xff0c;背景知识 2&#xff0c;gcc 如何完成 1&#xff0c;预处理(进行宏替换) 2&#xff0c;编译&#xff08;生成汇编&#xff09; 3&#xff0c;汇编&#xff08;生成机器可识别代码&#xff09; 4&#xff0c;连接&#xff08;生成可执行文件或库文件&…

Lombok超详解

目录 一、Lombok概述 二、Lombok插件安装 三、Lombok相关注解 3.1 Setter和Getter 3.2 ToString 3.3 EqualsAndHashCode&#xff0c;NonNull 3.4 NoArgsConstructor&#xff0c;RequiredArgsConstructor&#xff0c;AllArgsConstructor 3.5 Data 3.6 Builder 3.7 Log…