23

Is there a way to retrieve the aggregations' buckets in a search response, with the java API ?

{
  "took" : 185,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 200,
    "max_score" : 1.0,
    "hits" : [...]
  },
  "aggregations" : {
    "agg1" : {
      "buckets" : [...]
    },
    "agg2" : {
      "buckets" : [...]
    }
  }
}

Currently, it's possible to get the aggregations but I can't figure out how to get the buckets.

Current 1.0 version of ElasticSearch (v1.0.0.Beta2) is still a beta version, and maybe this feature still has to be added, but didn't find info on that point too.

3 Answers 3

41

Looking at the ES source on Github I see the following in their tests:

SearchResponse response = client().prepareSearch("idx").setTypes("type")
                .setQuery(matchAllQuery())
                .addAggregation(terms("keys").field("key").size(3).order(Terms.Order.count(false)))
                .execute().actionGet();

Terms  terms = response.getAggregations().get("keys");
Collection<Terms.Bucket> buckets = terms.getBuckets();
assertThat(buckets.size(), equalTo(3));
Sign up to request clarification or add additional context in comments.

5 Comments

Great! This is exactly the missing "link" I was looking for, I hope there will be something in the API or the reference to explain this part.
I think you have now to use terms.getBuckets() instead of terms.buckets().
How is this answer the correct one? Terms.Bucket is package protected and can't be accessed.
I see Terms.Bucket is not package protected; however, DateHistogram.Bucket is. To get DateHistogram buckets you would have to use: Collection<? extends DateHistogram.Bucket> buckets = dateHistogram.getBuckets(); This is what was confusing me.
If you are trying to get buckets of Significant String Terms aggregation : Collection<SignificantStringTerms.Bucket> buckets = ((SignificantStringTerms) response.getAggregations().get("keys")).getBuckets();
9

If anyone wonder about accessing actual documents count out of these buckets following code might help.

Terms  terms = response.getAggregations().get("agg1");
Collection<Terms.Bucket> buckets = terms.getBuckets();
for (Bucket bucket : buckets) {
    System.out.println(bucket.getKeyAsText() +" ("+bucket.getDocCount()+")");
}

1 Comment

Mind that bucket can have sub buckets
0

In case anyone is looking for a sum aggregation, it's as easy as assigning the result to a org.elasticsearch.search.aggregations.metrics.sum.Sum variable:

ElasticConnector connector = ... // initialize ES connector
SearchResponde response = connector.getClient()
    .prepareSearch(...)
    .setQuery(...)
    .addAggregation(AggregationBuilders.sum("my_sum").field(...))
    .get();
Sum sum = response.getAggregations().get("my_sum");
double result = sum.getValue();

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.