You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键变化说明:

  1. 聚合类型从旧的 ParsedLongTerms 替换为新客户端对应的 LongTermsAggregate;
  2. 通过 aggregations.get(String name, Class<T> type) 类型安全地获取聚合结果,避免强制类型转换;
  3. 桶的遍历方式改为新客户端的 buckets().array(),并通过 bucket.key() 获取键值。

内容的提问来源于stack exchange,提问作者Andreas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 08:35:33