Elasticsearch8+SpringBoot3+JDK17升级后聚合代码重构求助
Spring Boot 3.1.5 + ES8 升级问题解决方案
一、依赖兼容性问题
你当前的依赖存在版本不匹配问题:
- Spring Boot 3.1.5 对应的
spring-data-elasticsearch版本应为 5.1.x(Spring Boot 3.x 适配 Spring Data 2022.x 系列,对应 spring-data-elasticsearch 5.x),你手动指定的 4.3.6 是适配 Spring Boot 2.7.x 的版本,两者不兼容。 spring-boot-starter-data-elasticsearch已包含spring-data-elasticsearch和官方 Elasticsearch Java Client,无需单独引入elasticsearch-java,避免版本冲突。
修正后的依赖配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> <!-- Spring Boot 3.1.5 自动管理适配版本,无需手动指定 --> </dependency> <!-- 如需指定Elasticsearch版本,可通过properties统一配置 --> <!-- <properties> <elasticsearch.version>8.11.1</elasticsearch.version> </properties> -->
二、ES8客户端说明
你的说法正确:Elasticsearch 8.x 官方已废弃 Rest High Level Client(RHLC),推荐使用全新的 Elasticsearch Java Client(即 co.elastic.clients:elasticsearch-java)。Spring Data Elasticsearch 5.x 版本开始,底层默认切换为该客户端,完全适配 ES8。
三、聚合代码重构
spring-data-elasticsearch 5.x 聚合 API 已适配新的 Java Client,不再支持旧版本的 get(String) 方法,需改用类型安全的方式获取聚合结果。重构后的代码如下:
import org.springframework.data.elasticsearch.core.SearchHits; import org.springframework.data.elasticsearch.core.AggregationsContainer; import co.elastic.clients.elasticsearch._types.aggregations.LongTermsAggregate; import co.elastic.clients.elasticsearch._types.aggregations.TermsBucket; import java.util.LinkedHashSet; import java.util.Set; public static Set<Integer> getAggregations(SearchHits<ElasticSearchArticleDto> search, String aggregationName) { Set<Integer> result = new LinkedHashSet<>(); AggregationsContainer<?> aggregations = search.getAggregations(); if (aggregations != null) { // 类型安全方式获取Long类型的terms聚合结果 LongTermsAggregate termsAggregate = aggregations.get(aggregationName, LongTermsAggregate.class); if (termsAggregate != null && termsAggregate.buckets() != null) { for (TermsBucket bucket : termsAggregate.buckets().array()) { if (bucket.key() != null) { result.add(bucket.key().longValue().intValue()); } } } } return result; }
关键变化说明:
- 聚合类型从旧的
ParsedLongTerms替换为新客户端对应的LongTermsAggregate; - 通过
aggregations.get(String name, Class<T> type)类型安全地获取聚合结果,避免强制类型转换; - 桶的遍历方式改为新客户端的
buckets().array(),并通过bucket.key()获取键值。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

