嵌套桶編輯
(測試資料:http://blog.csdn.net/wwd0501/article/details/78501842)在我們使用不同的嵌套方案時,聚合的力量才能真正得以顯現。 在前例中,我們以及看到如何将一個度量嵌入桶中,它的功能已經十分強大了。
但真正令人激動的分析來自于将桶嵌套進 另外一個桶 所能得到的結果。 現在,我們想知道每個顔色的汽車制造商的分布:
GET /cars/transactions/_search
{
"size" : 0,
"aggs": {
"colors": {
"terms": {
"field": "color"
},
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
},
"make": {
"terms": {
"field": "make"
}
}
}
}
}
}
注意前例中的 度量仍然保持原位。 | |
另一個聚合 被加入到了 顔色桶中。 | |
這個聚合是 桶,它會為每個汽車制造商生成唯一的桶。 |
這裡發生了一些有趣的事。 首先,我們可能會觀察到之前例子中的
avg_price
度量完全沒有變化,還在原來的位置。 一個聚合的每個 層級 都可以有多個度量或桶,
avg_price
度量告訴我們每種顔色汽車的平均價格。它與其他的桶和度量互相獨立。
這對我們的應用非常重要,因為這裡面有很多互相關聯,但又完全不同的度量需要收集。聚合使我們能夠用一次資料請求獲得所有的這些資訊。
另外一件值得注意的重要事情是我們新增的這個
make
聚合,它是一個
terms
桶(嵌套在
colors
、
terms
桶内)。這意味着它 會為資料集中的每個唯一組合生成(
color
、
make
)元組。
讓我們看看傳回的響應(為了簡單我們隻顯示部分結果):
{
...
"aggregations": {
"colors": {
"buckets": [
{
"key": "red",
"doc_count": 4,
"make": {
"buckets": [
{
"key": "honda",
"doc_count": 3
},
{
"key": "bmw",
"doc_count": 1
}
]
},
"avg_price": {
"value": 32500
}
},
...
}
正如期望的那樣,新的聚合嵌入在每個顔色桶中。 | |
現在我們看見按不同制造商分解的每種顔色下車輛資訊。 | |
最終,我們看到前例中的 度量仍然維持不變。 |
響應結果告訴我們以下幾點:
- 紅色車有四輛。
- 紅色車的平均售價是 $32,500 美元。
- 其中三輛是 Honda 本田制造,一輛是 BMW 寶馬制造。
Java代碼實作:
/**
* Description:桶嵌套
* 例:計算每個顔色的汽車制造商的分布
* https://www.elastic.co/guide/cn/elasticsearch/guide/current/_buckets_inside_buckets.html
* @author wangweidong
* CreateTime: 2017年11月9日 下午3:47:54
*/
@Test
public void bucketsMetricsAggregation2() {
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);
//制造商
TermsAggregationBuilder makeField = AggregationBuilders.terms("make").field("make.keyword");
colorsField.subAggregation(makeField);
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 colorName = entry.getKey(); // Term
Long colorCount = entry.getDocCount(); // Doc count
Aggregations agg = entry.getAggregations();
Avg avg = agg.get("avg_price");
Double avgPrice = avg.getValue();
String info = "其中";
Terms makes = entry.getAggregations().get("make");
for (Terms.Bucket makeEntry : makes.getBuckets()) {
Object makeName = makeEntry.getKey();
Long makeCount = makeEntry.getDocCount();
info = info + makeCount + "輛是" + makeName + "制造,";
}
System.out.println(colorName + "車有" + colorCount + "輛,平均每台車價格:" + avgPrice + "," + info);
}
}
文章參考: https://www.elastic.co/guide/cn/elasticsearch/guide/current/_buckets_inside_buckets.html