添加度量指标编辑
前面的例子(http://blog.csdn.net/wwd0501/article/details/78501842,测试数据跟上篇一样)告诉我们每个桶里面的文档数量,这很有用。 但通常,我们的应用需要提供更复杂的文档度量。 例如,每种颜色汽车的平均价格是多少?
为了获取更多信息,我们需要告诉 Elasticsearch 使用哪个字段,计算何种度量。 这需要将度量 嵌套 在桶内, 度量会基于桶内的文档计算统计结果。
GET /cars/transactions/_search { "size" : 0, "aggs": { "colors": { "terms": { "field": "color" }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } } }
正如所见,我们用前面的例子加入了新的 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 } } ] } } ... }
尽管响应只发生很小改变,实际上我们获得的数据是增长了。之前,我们知道有四辆红色的车,现在,红色车的平均价格是 $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