ElasticSearch5.X添加度量聚合(二)

来源:互联网 发布:淘宝开代购店 编辑:程序博客网 时间:2024/06/07 13:07

添加度量指标编辑

前面的例子(http://blog.csdn.net/wwd0501/article/details/78501842,测试数据跟上篇一样)告诉我们每个桶里面的文档数量,这很有用。 但通常,我们的应用需要提供更复杂的文档度量。 例如,每种颜色汽车的平均价格是多少?

为了获取更多信息,我们需要告诉 Elasticsearch 使用哪个字段,计算何种度量。 这需要将度量 嵌套 在桶内, 度量会基于桶内的文档计算统计结果。

让我们继续为汽车的例子加入 average 平均度量:

GET /cars/transactions/_search{   "size" : 0,   "aggs": {      "colors": {         "terms": {            "field": "color"         },         "aggs": {             "avg_price": {                "avg": {                  "field": "price"                }            }         }      }   }}
拷贝为 CURL在 SENSE 中查看 

为度量新增 aggs 层。

为度量指定名字: avg_price 。

最后,为 price 字段定义 avg 度量。

正如所见,我们用前面的例子加入了新的 aggs 层。这个新的聚合层让我们可以将 avg 度量嵌套置于 terms 桶内。实际上,这就为每个颜色生成了平均价格。

正如 颜色 的例子,我们需要给度量起一个名字( avg_price )这样可以稍后根据名字获取它的值。最后,我们指定度量本身( avg )以及我们想要计算平均值的字段( price ):

{...   "aggregations": {      "colors": {         "buckets": [            {               "key": "red",               "doc_count": 4,               "avg_price": {                   "value": 32500               }            },            {               "key": "blue",               "doc_count": 2,               "avg_price": {                  "value": 20000               }            },            {               "key": "green",               "doc_count": 2,               "avg_price": {                  "value": 21000               }            }         ]      }   }...}

响应中的新字段 avg_price 。

尽管响应只发生很小改变,实际上我们获得的数据是增长了。之前,我们知道有四辆红色的车,现在,红色车的平均价格是 $32,500 美元。这个信息可以直接显示在报表或者图形中。

java代码实现

/**      * Description:桶聚合查询中添加度量指标      * 例:计算每种颜色汽车的平均价格是多少      *       * @author wangweidong      * CreateTime: 2017年11月9日 下午3:47:54     */    @Test    public void bucketsMetricsAggregation() {    String index = "cars";    String type = "transactions";    SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index).setTypes(type);            TermsAggregationBuilder colorsField = AggregationBuilders.terms("popular_colors").field("color.keyword");        AvgAggregationBuilder avgPriceField = AggregationBuilders.avg("avg_price").field("price");        colorsField.subAggregation(avgPriceField);                searchRequestBuilder.addAggregation(colorsField);        searchRequestBuilder.setSize(0);        SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();                System.out.println(searchResponse.toString());                Terms genders = searchResponse.getAggregations().get("popular_colors");    for (Terms.Bucket entry : genders.getBuckets()) {    Object key = entry.getKey();      // Term        Long count = entry.getDocCount(); // Doc count                Aggregations agg = entry.getAggregations();        Avg avg = agg.get("avg_price");        Double avgPrice = avg.getValue();                System.out.println(key + "车有" + count + "辆,平均每台车价格:" + avgPrice);    }    }
文章参考:https://www.elastic.co/guide/cn/elasticsearch/guide/current/_adding_a_metric_to_the_mix.html