背景

Elasticsearch 版本发布的很勤, API 客户端的用法各个版本之间差异也是很大。尤其是 Elasticsearch 8.x 版本直接废弃了 RestHighLevelClient 对象。 Query 和 Aggregation 的 Builder 的用法也有变化。

本文记录项目升级 Elasticsearch API 到 8.x 版本时聚合 API 遇到的问题及解决办法。8.x 的 client jar 包 elasticsearch-java,里面的包名称路径都变了。资料又少,耗了一周可算搞定了最麻烦的聚合问题。

Elasticsearch 8.x 版本API

多层级聚合的方法,几乎搜不到资料。最后是在CSDN 的 AI搜索中找到的:提问是:

Elastic8.x 的 API 中 subAggregation的等价方案是什么?

新的 Java 客户端使用了完全不同的构建方式,它更加类型安全。我们需要使用静态工厂方法来创建聚合。以下是给出的 terms 聚合嵌套 avg 聚合 的例子。

在这里插入代码片// 构建聚合
Aggregation byCategory = Aggregation.of(a -> a.terms(TermsAggregation.of(t -> t.field("category"))).aggregations("avg_price", Aggregation.of(avg -> avg.average(AverageAggregation.of(av -> av.field("price")))))
);

添加多个子聚合

 Aggregation termAgg = Aggregation.of(a -> {Aggregation.Builder.ContainerBuilder containerBuilder = a.terms(TermsAggregation.of(t -> t.field(field)));// 逐个添加子聚合到 Terms 聚合上for (Aggregation child : children) {// TODO 设置子聚合名称String childAggName = "";containerBuilder.aggregations(childAggName, child);}// 返回最终结果return containerBuilder;});

测试代码:

TermsAggregationBuilder baseAgg = AggregationBuilders.terms("field1").name("group_field1");
baseAgg.subAggregation(AggregationBuilders.max("max_field2").field("field2"));
baseAgg.subAggregation(AggregationBuilders.min("min_field2").field("field2"));Aggregation finalAgg = baseAgg.aggregation();
System.out.println(finalAgg);

对 字段1聚合,同时包含两个子聚合聚合字段2的最大值和最小值:

{"aggregations": {"max_field2": {"max": {"field": "field2"}},"min_field2": {"min": {"field": "field2"}}},"terms": {"field": "field1"}
}

请求体聚合

  // 8.x SearchRequest 构建方法使用 BuilderSearchRequest.Builder requestBuilder = new SearchRequest.Builder();requestBuilder.index(Arrays.asList(indices));requestBuilder.withJson(new StringReader(builder.toString()));// 检查是否具有聚合属性并追加到请求体List<AggregationBuilder> aggregations = builder.getAggregations();if (aggregations != null) {for(AggregationBuilder aggBuilder :aggregations) {String aggName = aggBuilder.getName();Aggregation aggValue = aggBuilder.aggregation();requestBuilder.aggregations(aggName, aggValue);}}

这里的 AggregationBuilder 是为了适配高版本的 API,自定义的一个构建器,针对不同类型的聚合,对应等价创建出 8.x 版本的 Aggregation 对象,同时包含一个聚合名称参数:

public class AggregationBuilder {// 聚合名称 name// 子聚合列表 children// 当前聚合对象 aggregation.... 
}

最终聚合 JSON 对象,请求 SearchRequest 对象中 N 个聚合的情况:

{"aggregations": {"max_field2": {"max": {"field": "field2"}},"min_field2": {"min": {"field": "field2"}}},
}

启示录

Elasticsearch 8.x 的子聚合用法的 lambda 方式创建时,中间变量返回 Aggregation.Builder.ContainerBuilder 类型,它的 aggregations 函数可以反复添加新的聚合,从而形成嵌套子聚合的方法。

虽然没有 Elasticsearch 6.x 客户端的 subAggregation 方法好用,但是还是可以等价实现的。

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

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

相关文章

Dify功能熟悉

Dify功能熟悉 文章目录Dify功能熟悉一、介绍1.1 快速开始1.2 官方文档二、workflow2.1 开始和结束2.2 简单示例三、节点3.1 节点一览表3.2 节点-----开始3.3 节点-----LLM3.4 知识检索&#xff08;增强回答准确性&#xff09;3.5 Agent智能体3.6 问题分类器3.7 http四、工具&am…

app引导页设计要点与交互细节详解

在移动应用的设计中&#xff0c;用户第一次打开APP时看到的往往就是app引导页。它不仅是品牌与用户接触的第一道界面&#xff0c;也是决定用户是否愿意继续探索的关键入口。一个设计合理、信息传达清晰的app引导页&#xff0c;能够帮助产品建立专业感与品牌价值&#xff0c;同时…

香港服务器SSH安全加固方案与密钥认证实践

香港服务器SSH安全加固方案与密钥认证实践在数字化时代&#xff0c;服务器安全成为企业不可忽视的重要议题。香港服务器因其地理位置和网络自由优势备受青睐&#xff0c;但同时也面临各种网络安全威胁。本文将深入探讨香港服务器SSH安全加固的核心方案&#xff0c;重点解析密钥…

Python的界面美化库 QDarkStyleSheet

Python的界面美化库 QDarkStyleSheet1、官网先看效果2、github地址3、动态切换主题用法效果代码1、官网先看效果 2、github地址 https://github.com/ColinDuquesnoy/QDarkStyleSheet?tabreadme-ov-file https://qdarkstylesheet.readthedocs.io/en/latest/screenshots.html …

同步本地文件到服务器上的Docker容器

同步本地文件到服务器上的Docker容器 要将本地文件同步到服务器上的Docker容器中&#xff0c;有几种常用方法&#xff1a; 1. 使用 docker cp 命令 # 将本地文件复制到运行中的容器 docker cp /本地/文件/路径 容器名或ID:/容器内/路径# 示例 docker cp ./app.py mycontainer:/…

[学习] 笛卡尔坐标系的任意移动与旋转详解

笛卡尔坐标系的任意移动与旋转详解 文章目录笛卡尔坐标系的任意移动与旋转详解**1. 笛卡尔坐标系基础****2. 坐标变换原理****2.1 平移变换****2.2 旋转变换****3. 组合变换**Python仿真与动态展示**动画说明**&#xff1a;**关键数学原理**&#xff1a;1. 笛卡尔坐标系基础 笛…

论文笔记:Parameter Competition Balancing for Model Merging

neurips 20241 intro近年来&#xff0c;模型融合&#xff08;model merging&#xff09;技术迅速发展&#xff0c;使得可以将多个分别针对不同任务微调后的模型直接集成为一个统一模型&#xff0c;从而实现多任务处理能力&#xff0c;而无需重新访问原始训练数据。然而&#xf…

逆向难度真相:仅用IDA静态分析的极限挑战

逆向难度真相&#xff1a;仅用IDA静态分析的极限挑战 纯IDA逆向难度重排&#xff08;从难到易&#xff09; Python > Go > Java > E语言 > CPython (地狱级难度) IDA困境&#xff1a; 主逻辑完全封装在PYZ/PYC资源中&#xff0c;IDA无法解析字节码结构字符串表只显…

vxe-table 通过配置 ajax 方式自动请求数据,适用于简单场景的列表

vxe-table 通过配置 ajax 方式自动请求数据&#xff0c;适用于简单场景的列表 当系统中很多页面都是简单列表时&#xff0c;每次都要手动去请求接口后再赋值&#xff0c;过程就会比较冗余繁琐。解决方式一般就是将封装一下。本章的方式是通过 vxe-grid 配置 ajax 来实现自动请求…

Zabbix 企业级分布式监控系统深度解析

一、监控系统核心认知1.1 监控的本质与价值监控&#xff08;Monitoring&#xff09;的核心是 “检测与预防”&#xff0c;在 IT 运维中占据约 30% 的权重。其核心价值体现在&#xff1a;风险预判&#xff1a;通过实时监测指标异常&#xff0c;提前发现潜在故障&#xff08;如服…

使用 .NET 6.0 的简单 WebSocket 客户端和服务器应用程序

几个月前&#xff0c;有同事来找我&#xff0c;问能否用 .NET 创建一个简单的 WebSocket 服务器&#xff08;以及之后的客户端&#xff09;。据我了解&#xff0c;他想用它来控制对方电脑上的进程。或许对其他人也有用&#xff0c;所以我把它发布在这里。让我们从服务器开始。我…

【ASP.NET Core】ASP.NET Core中Redis分布式缓存的应用

系列文章目录 链接: 【ASP.NET Core】REST与RESTful详解&#xff0c;从理论到实现 链接: 【ASP.NET Core】深入理解Controller的工作机制 链接: 【ASP.NET Core】内存缓存&#xff08;MemoryCache&#xff09;原理、应用及常见问题解析 文章目录系列文章目录前言一、Redis1.1 …

5.6 指令流水线 (答案见原书 P267)

5.6 指令流水线 (答案见原书 P267) 01. 下列关于流水CPU基本概念的描述中&#xff0c;正确的是&#xff08; D &#xff09;。 题目原文 下列关于流水CPU基本概念的描述中&#xff0c;正确的是&#xff08; &#xff09;。 A. 流水CPU是以空间并行性为原理构造的处理器 B. 流水…

NIO简单介绍和运用

NIO简单介 NIO 非阻塞IO模型&#xff0c;基于缓冲区(Buffer)读写数据&#xff0c;读写后的数据通过通道(Channel)进行传输&#xff0c;采用选择器(Selector)管理多个通道从而实现高并发。 核心组件&#xff1a;1. Buffer 为一个内存数组作为数据容器&#xff0c;代替传统的Inpu…

LeetCode 658.找到K个最接近的元素

给定一个 排序好 的数组 arr &#xff0c;两个整数 k 和 x &#xff0c;从数组中找到最靠近 x&#xff08;两数之差最小&#xff09;的 k 个数。返回的结果必须要是按升序排好的。 整数 a 比整数 b 更接近 x 需要满足&#xff1a; |a - x| < |b - x| 或者 |a - x| |b - x| …

制作一款打飞机游戏83:炸弹机制

游戏中的炸弹系统&#xff0c;包括以下核心功能&#xff1a;炸弹爆炸效果与动画实现炸弹伤害范围判定机制子弹转化为能量道具的系统炸弹使用时的无敌帧处理各种边界情况的修复与优化技术实现细节1. 炸弹基础系统‌炸弹动画状态机‌&#xff1a; 我们采用三阶段状态机控制炸弹效…

Linux CentOS 虚拟机升级内核至4.x以上版本

1、安装组件 yum install -y wget && yum install -y net-tools yum groupinstall “Development Tools” yum install ncurses-devel bc openssl-devel elfutils-libelf-devel yum install -y ncurses-devel yum install -y elfutils-libelf-devel yum install -y ope…

QT跨平台应用程序开发框架(11)—— Qt系统相关

目录 一&#xff0c;事件 1.1 关于事件 1.2 处理事件 1.3 处理鼠标事件 1.3.1 点击事件 1.3.2 释放事件 1.3.3 双击事件 1.3.4 滚轮事件 1.3.5 注意事项 1.4 处理键盘事件 1.5 定时器事件 1.6 窗口移动和大小改变事件 二&#xff0c;文件操作 2.1 文件操作概述 2.2 QFile 介绍…

sqli-labs通关笔记-第11关 POST字符型注入(单引号闭合 手工注入+脚本注入两种方法)

目录 一、字符型注入 二、limit函数 三、GET方法与POST方法 四、源码分析 1、代码审计 2、SQL注入安全分析 五、渗透实战 1、进入靶场 2、注入点分析 &#xff08;1&#xff09;SQL语句 &#xff08;2&#xff09;万能密码登录 3、手工注入 &#xff08;1&#xf…

网络安全基础作业三

回顾web前端的代码<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>用户登录</title><st…