2014-01-09 12 views
20

Java APIを使用して、検索応答で集計のバケットを取得する方法はありますか?SearchResponseのelasticSearch 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" : [...] 
    } 
    } 
} 

現在のところ、集計を取得することはできますが、バケットを取得する方法はわかりません。

現行バージョンのElasticSearch(v1.0.0.Beta2)はまだベータ版ですが、この機能はまだ追加する必要がありますが、その点についての情報も見つかりませんでした。私は彼らのテストでは、次を参照してくださいES source on Githubを見てみると

答えて

31

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.buckets()'の代わりに 'terms.getBuckets()'を使うべきだと思います。 – Sonson123

+2

この回答はどのように正しいですか? Terms.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

バケットにサブバケットを含めることができます –

関連する問題