2017-03-23 85 views
1

我想在我的Java应用程序中获得聚合。ElasticSearch与Java的聚合

首先,我用curl约束了REST查询。它看起来像:

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" 
      } 
     } 
     } 
    } 
    } 
} 
' 

它返回的结果如我所料

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() + " "); 
     } 

的问题是:

如何获取当前bucket ite的“contract_sum”聚合值M&

当我在IntelliJ IDEA的使用调试工具似乎它可以

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())); 
}