Springboot操作Elasticsearch——聚合分组与排序

2023-11-15

这两天项目中需要从es中查询数据,根据某个字段进行分组,求其最大、最小、平均值,并按最大值进行排序。

springboot的版本号:2.0.6.RELEASE

Elasticsearch的版本号:5.6.3

主要代码记录下:

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
                .filter(QueryBuilders.termsQuery("a", aList))
                .filter(QueryBuilders.termsQuery("b", bList))
                .filter(QueryBuilders.rangeQuery("cTime")
                        .from(startTime)
                        .to(endTime));
AggregationBuilder termsBuilder = AggregationBuilders.terms("fieldTerms").field("myField").size(99999).order(Terms.Order.aggregation("max_f", false));
MaxAggregationBuilder maxAggf = AggregationBuilders.max("max_f").field("prod.f");
MinAggregationBuilder minAggf = AggregationBuilders.min("min_f").field("prod.f");
AvgAggregationBuilder avgAggf = AggregationBuilders.avg("avg_f").field("prod.f");
termsBuilder.subAggregation(maxAggf);
termsBuilder.subAggregation(minAggf);
termsBuilder.subAggregation(avgAggf);
termsBuilder.subAggregation(maxAggMem);
termsBuilder.subAggregation(minAggMem);
termsBuilder.subAggregation(avgAggMem);

TransportClient transportClient = ESConnectionManagement.getInstance();
SearchRequestBuilder searchRequestBuilder = transportClient.prepareSearch("indexName_*")
        .setTypes("type1", "type2")
        .setScroll(TimeValue.timeValueMinutes(1))
        .setQuery(queryBuilder)
        .addAggregation(aggregationBuilder)
        .setSize(0); // 只获取聚合结果,不显示hits数据
SearchResponse scrollResponse = searchRequestBuilder.execute().actionGet();
Map<String, Aggregation> map =  scrollResponse.getAggregations().asMap();
    
StringTerms stringTerms = (StringTerms)map.get("fieldTerms");
List<StringTerms.Bucket> buckets = stringTerms.getBuckets();

for (StringTerms.Bucket bucket : buckets) {
    String myField = bucket.getKeyAsString();
    Map<String, Aggregation> aggMap = bucket.getAggregations().asMap();
    // 获取的最大、最小、平均值
    InternalMax maxf = (InternalMax)aggMap.get("max_f");
    String maxfValue = BigDecimal.valueOf(maxf.getValue())
            .setScale(2, BigDecimal.ROUND_HALF_UP)
            .toString();

    InternalMin minf = (InternalMin)aggMap.get("min_f");
    String minfValue = BigDecimal.valueOf(minf.getValue())
            .setScale(2, BigDecimal.ROUND_HALF_UP)
            .toString();

    InternalAvg avgf = (InternalAvg)aggMap.get("avg_f");
    String avgfValue = BigDecimal.valueOf(avgf.getValue())
            .setScale(2, BigDecimal.ROUND_HALF_UP)
            .toString();
    ...
}

其中

1、termsBuilder.subAggregation(maxAggf);

表示往分组聚合对象里追加聚合函数,可以追加多个聚合函数。

2、AggregationBuilders.terms("fieldTerms").field("myField").size(99999).order(Terms.Order.aggregation("max_f", false));

表示将字段myField进行分组,并按聚合字段max_f倒序排列,设置最多返回99999条结果,若不写则默认返回10条结果,需要注意。

3、InternalMax maxf = (InternalMax)aggMap.get("max_f");

表示最大值的聚合对象获取到的值类型,会有对应的InternalMax对象来接收,最小值对象为InternalMin,平均值对象为InternalAvg。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Springboot操作Elasticsearch——聚合分组与排序 的相关文章

随机推荐

  • umi中AssertionError [ERR_ASSERTION]: filePath not found of

    看到了吗 兄弟姐妹们 这个问题整了一天才整的出来 错误的原因主要是由于npm安装的依赖和yarn安装的依赖起了冲突 如果是使用npm i 进行安装的依赖 在使用yarn start进行启动的时候就会出现这个问题 解决办法 1 不知道冲突的是
  • 程序员MM一年的工作总结

    11月8号就是 工作 一周年纪念日了 是该对这过去的一年做个总结了 当初来这个公司因为它是第一个递橄榄枝给我的地方 为了尽量少的减少毕业和工作之间的空档时间 就接受了 我在这一年中改变很大 这样的改变是综合的 1 技术 这里所说的技术应该算
  • 5.mybatisPlus自定义SQL

    今日内容 MP自带的条件构造器虽然很强大 有时候也避免不了写稍微复杂一点业务的sql 比如多表查询 那么那么今天说说MP怎么自定义sql语句吧 另外 除了下文提到的通过queryWrapper实现筛选以外 调用查询时 如果你需要做分页 通过
  • 【Android】开机自启动

    要想在Android系统中实现开机启动 很简单 只需要几个步骤就可以了 1 定义广播类 2 Manifest xml中注册广播类 3 添加权限 下面就是具体操作了 首先 我们来定义广播类 创建一个类BootReceiver 使其继承Broa
  • 使用GPT学习网络设备与安全设备之是什么、为什么

    文章目录 1 网络设备 1 1 交换机 1 1 1 什么是交换机 1 1 2 为什么使用交换机 1 2 路由器 1 2 1 什么是路由器 1 2 2 为什么使用路由器 1 3 无线控制器 1 3 1 什么是无线控制器 1 3 2 为什么使用
  • scikit-learn_Scikit Learn-快速指南

    scikit learn Scikit Learn 快速指南 Scikit Learn Quick Guide Scikit Learn 简介 Scikit Learn Introduction In this chapter we wil
  • Docker安装EalasticSearch、Kibana,安装Elasticvue插件

    一 安装ES 1 拉取EalasticSearch镜像 2 配置ES 3 启动ES 4 测试 二 安装Kibana 1 拉取Kibana镜像 2 启动Kibana 3 配置Kibana 4 测试 三 安装Elasticvue插件 1 Ela
  • iOS 切图使用 分辨率 使用 相关总结

    疑问 就iphone来说分辨率有三种 320 480 640 960 640 1136 那么如果我想做图 如果是320 480 1 是不是所有的图片 比如按钮的 背景图的 尺寸都必须做成小于或等于320 480的分辨率 2 是否可以做一张大
  • Latex各种命令、符号、公式、数学符号、排版等

    本文仅供学习参考使用 一切版权和解释权均归原作者所有 转载地址 http blog csdn net garfielder007 article details 51646604 数学符号详细内容见 http mohu org info s
  • vue的v-for循环中图片加载路径问题

    vue的v for循环中图片加载路径问题 产品要求 要求图片和它的名字一一对应 vue中的img的src可以动态绑定到一个变量上
  • 个数是如何用大数据做行为预测的?

    个数 是 个推 旗下面向 APP 开发者提供数据统计分析的产品 个数 通过可视化埋点技术及大数据分析能力从用户属性 渠道质量 行业对比等维度对 APP 进行全面的统计分析 个数 不仅可以及时统计用户的活跃 新增等 还可以分析卸载用户的成分
  • 【网安神器篇】——searchsploit漏洞利用搜索工具

    作者名 Demo不是emo 主页面链接 主页传送门 创作初心 一切为了她座右铭 不要让时代的悲哀成为你的悲哀专研方向 网络安全 数据结构 每日emo 我最常欺骗的人其实是我自己 通过一些技术手段 掌握到一些软件的版本信息应该如何利用呢 举个
  • oh-my-zsh 为 ls 命令自定义颜色

    ls 命令默认显示的颜色是 白色 表示普通文件 蓝色 表示目录 绿色 表示可执行文件 红色 表示压缩文件 蓝绿色 链接文件 红色闪烁 表示链接的文件有问题 黄色 表示设备文件 灰色 表示其他文件 在 oh my zsh 主题下如何自定义这些
  • CodeGeeX - 免费的AI编程助手

    1 官网 CodeGeeX 官网 2 VSCode安装CodeGeeX CodeGeeX 扩展 3 普通模式 无需付费 无需登录 下载就用 运行结果 4 拆分视图模式 快捷键Ctrl Enter触发拆分视图显示模式 5 生成注释模式 支持J
  • [经典论文分享] Attention, Learn to Solve Routing Problems!

    1 背景 自从有人基于指针网络解决组合优化问题以来 基于ML的组合优化问题求解模型逐渐被关注 基于深度强化学习的组合优化求解带来了较高的模型准确度和泛化性 但是目前基于DRL的CO求解准确度和训练效率一般 简单来说就是模型不是很成熟 针对模
  • 科技云报道:软件供应链安全如此重要,但为什么难以解决?

    科技云报道原创 软件供应链安全如今已经成了一个世界性难题 从2021年底Apache Log4j 核弹级 风险爆发 时至今日影响仍然存在 保障软件供应链安全已成为业界关注焦点 但近2年时间过去了 软件供应链安全问题似乎并没有得以缓解 安全事
  • 发送ARP数据包

    发送ARP数据包 ARP 地址解析协议 即ARP Address Resolution Protocol 是根据IP地址获取物理地址的一个TCP IP协议 主机发 送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机 并接收返回消息
  • 服务器虚拟化技术

    一 服务器虚拟化概述 1 服务器虚拟化简介 在一台物理服务器上运行多个虚拟服务器称为 服务器虚拟化 在服务器虚拟化中 专用虚拟化软件将物理服务器上的处理器存储器之类的资源划分为多个资源 并将其分配给虚拟服务器 由于可以在一台物理服务器上聚合
  • Python爬虫 XPath解析出乱码 解决方法

    请求后加上编码 resp requests get url headers headers resp encoding GBK
  • Springboot操作Elasticsearch——聚合分组与排序

    这两天项目中需要从es中查询数据 根据某个字段进行分组 求其最大 最小 平均值 并按最大值进行排序 springboot的版本号 2 0 6 RELEASE Elasticsearch的版本号 5 6 3 主要代码记录下 BoolQuery