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

Spring Data Elasticsearch 4.4.2聚合查询升级问题求助

解决Spring Data Elasticsearch 4.4.2聚合查询的破坏性变更问题

针对升级后遇到的两处问题,直接给出适配方案和修改说明:

1. 替换addAggregation为withAggregations

Spring Data Elasticsearch 4.4.x中,NativeSearchQueryBuilder的addAggregation方法被移除,改用withAggregations方法,该方法支持传入单个或多个聚合构建器,单个聚合场景下直接传入目标构建器即可。

2. 聚合结果的获取方式调整

新版本中SearchHits.getAggregations()返回AggregationsContainer类型,不再支持直接通过名称获取聚合对象,需要通过指定聚合类型的get方法来精准获取对应聚合结果。

适配后的完整代码

SearchSourceBuilder builder = this.getQuery(filter, false);
String aggregationName = "group_by_author_id";

TermsAggregationBuilder aggregationBuilders =
    AggregationBuilders.terms(aggregationName).field("authors");

// 改动1:用withAggregations替换原addAggregation方法
var query =
    new NativeSearchQueryBuilder()
        .withQuery(builder.query())
        .withAggregations(aggregationBuilders)
        .build();

var result = elasticsearchOperations.search(query, EsBook.class, ALIAS_COORDS);

if (!result.hasAggregations()) {
  throw new IllegalStateException("No aggregations found after query with aggregations!");
}

// 改动2:通过指定类型的get方法获取Terms聚合
Terms groupById = result.getAggregations().get(Terms.class, aggregationName);
var buckets = groupById.getBuckets();

Map<Long, Integer> booksCount = new HashMap<>();
buckets.forEach(
    bucket ->
        booksCount.put(
            bucket.getKeyAsNumber().longValue(), Math.toIntExact(bucket.getDocCount())));

return booksCount;

补充:动态遍历聚合的处理方式

如果需要兼容多种聚合类型或动态匹配聚合,也可以通过遍历所有聚合来筛选目标对象:

for (Aggregation aggregation : result.getAggregations().aggregations()) {
    if (aggregationName.equals(aggregation.getName()) && aggregation instanceof Terms) {
        Terms groupById = (Terms) aggregation;
        // 后续桶数据处理逻辑
        break;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:20:57