2014-01-09 3 views
20

Есть ли способ получить ведра агрегирования в ответе на поиск с помощью java API?Как получить результат аггрегации с помощью java api в researchSearch в SearchResponse?

{ 
    "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" : [...] 
    } 
    } 
} 

В настоящее время, можно получить агрегированные, но я не могу понять, как получить ведро.

Текущая версия 1.0 ElasticSearch (v1.0.0.Beta2) по-прежнему является бета-версией, и, возможно, эту функцию еще нужно добавить, но она не нашла информации по этому вопросу.

ответ

31

Глядя на ES source on Github я вижу следующее в своих тестах:

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)); 
+0

Отлично! Это как раз недостающая «ссылка», которую я искал, я надеюсь, что в API будет что-то или ссылка, чтобы объяснить эту часть. – ThomasC

+1

Я думаю, что теперь вы должны использовать 'terms.getBuckets()' вместо 'terms.buckets()'. – Sonson123

+2

Как этот ответ правильный? Условия.Bucket защищен пакетом и не могут быть доступны. – Michael

7

Если кто-нибудь задаться вопросом о доступе реальных документов отсчитывать из этих ведер следующий код может помочь.

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

Помните, что ведро может иметь вспомогательные ведра –