直到最近,我们一直在 4.1.13 版本中使用 spring-data-elasticsearch 从弹性搜索中进行查询。为了对某些东西进行分组,我们使用了聚合 考虑书籍索引。每本书可以有一个或多个作者 为了按作者计算书籍数量,我们使用TermsAggregationbuilder 来获得此分组,如下所示
SearchSourceBuilder builder = this.getQuery(filter, false);
String aggregationName = "group_by_author_id";
TermsAggregationBuilder aggregationBuilders =
AggregationBuilders.terms(aggregationName).field("authors");
var query =
new NativeSearchQueryBuilder()
.withQuery(builder.query())
.addAggregation(aggregationBuilders)
.build();
var result = elasticsearchOperations.search(query, EsBook.class, ALIAS_COORDS);
if (!result.hasAggregations()) {
throw new IllegalStateException("No aggregations found after query with aggregations!");
}
Terms groupById = result.getAggregations().get(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 ;
我们最近升级到 spring-data-elasticsearch 4.4.2 并发现有一些重大变化。 首先 .addAggregations 被替换为 withAggregations
第二与之前不同的是,我似乎无法在查询后直接获取术语和存储桶 result.getAggregations().get(aggregationName); 不再可能,我看到的唯一其他选项是 result.getAggregations().aggregations()。所以我想知道是否有人做过同样的事情。 Elasticsearch 的文档本身太差了。
首先 .addAggregations 被 withAggregations 取代
addAggregation(AbstractAggregationBuilder<?>)
已被弃用,应替换为 withAggregations
。这不是一个重大变化。
SearchHits.getAggregations()
返回值的变化记录在从 4.2 到 4.3 的迁移指南中“从 API 中删除 org.elasticsearch 类。”
因此从 4.3 开始,
result.getAggregations().aggregations()
返回的值与之前 result.getAggregations()
返回的值相同。