Spring data elasticsearch - Aggregations in new version

Viewed 17

We have been using spring-data-elasticsearch for 4.1.13 until recently for querying from elastic search. For grouping something we used aggregations Consider a index of books. For each book there can be one or multipe authors To get count of books by author we used TermsAggregationbuilder to get this grouping as shown below

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 ;

We recently upgraded to spring-data-elasticsearch 4.4.2 and saw that there are some breaking changes. First .addAggregations were replaced by withAggregations

Second unlike before I cant seem to directly get Terms and buckets after querying as result.getAggregations().get(aggregationName); is no more possible and only other option I see is result.getAggregations().aggregations(). So am wondering if anyone has done the same. The documentation itself is so poor in Elastic search.

1 Answers

First .addAggregations were replaced by withAggregations

addAggregation(AbstractAggregationBuilder<?>) has been deprecated and should be replaced by withAggregations. This is not a breaking change.

The change in the returned value for SearchHits.getAggregations() is documented in the migration guides from 4.2 to 4.3 "Removal of org.elasticsearch classes from the API."

So from 4.3 on result.getAggregations().aggregations() returns the same that previously result.getAggregations() returned.

Related