Elasticsearch Java 8.x 的聚合 API 及子聚合的用法

背景

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…