2017-03-23 26 views
1

私のJavaアプリケーションで集約したいと思っています。JavaでのElasticSearch集約

まず、curlでRESTクエリを作成しました。

:私は質問がある

enter image description here

私はJavaでいくつかのコードを作成しました。その後

Settings settings = Settings.builder().put("cluster.name", elasticProperties.getElasticClusterName()).build(); 
    log.info("Initializing ElasticSearch client"); 
    try (TransportClient client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(
      InetAddress.getByName(elasticProperties.getElasticTransportAddress()), elasticProperties.getElasticTransportPort()))) { 

     // Base query 
     log.info("Preparing query"); 
     SearchRequestBuilder requestBuilder = client.prepareSearch(elasticProperties.getElasticIndexName()) 
       .setTypes(elasticProperties.getElasticTypeName()) 
       .setSize(Top); 

     // Add aggregations 
     AggregationBuilder aggregation = 
       AggregationBuilders 
         .terms("customer_id") 
         .field("customer_id") 
         //.order(Terms.Order.aggregation("customer_id", "contract_sum", false)) 
         .subAggregation(
           AggregationBuilders.sum("total_contract_sum") 
           .field("contract_sum") 
         ); 
     requestBuilder.addAggregation(aggregation); 
     // Get response 
     log.info("Executing query"); 
     SearchResponse response = requestBuilder.get(); 

     log.info("Query results:"); 

     Terms contractSums = response.getAggregations().get("customer_id"); 
     for (Terms.Bucket bucket : contractSums.getBuckets()) { 
      log.info(" " + bucket.getKey() + " "); 
     } 

を予想通り、それが結果を返さ

curl -XGET 'localhost:9200/analysis/_search?pretty' -H 'Content-Type: 

application/json' -d' 
{ 
    "size": 0, 
    "query" : { 
     "bool": { 
      "must": [ 
       { "term" : { "customer_id" : 5117 } } 
      ] 
     } 
    }, 
    "aggs": { 
    "customer_id": { 
     "terms": { 
     "field": "customer_id", 
     "order": { 
      "contract_sum": "desc" 
     } 
     }, 
     "aggs": { 
     "contract_sum": { 
      "sum": { 
      "field": "contract_sum" 
      } 
     } 
     } 
    } 
    } 
} 
' 

:次のようになります

現在のバケットの「contract_sum」集計値の取得方法m?私はIntelliJのアイデアでデバッグツールを使用すると

enter image description here

のコード例で私を助けてくださいすることができているようです。

答えて

1

私は私のインターネットの友達と一緒に解決策を見つけた

log.info("Query results:"); 
Terms contractSums = response.getAggregations().get("customer_id"); 
for (Terms.Bucket bucket : contractSums.getBuckets()) { 
    Sum aggValue = bucket.getAggregations().get("total_contract_sum"); 
    DecimalFormat formatter = new DecimalFormat("0.00"); 
    log.info(" " + bucket.getKey() + " " + formatter.format(aggValue.getValue())); 
} 
関連する問題