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
相关产品推荐
相关产品推荐

