天天看點

ElasticSearch5.X嵌套桶(三)

嵌套桶編輯

(測試資料:http://blog.csdn.net/wwd0501/article/details/78501842)在我們使用不同的嵌套方案時,聚合的力量才能真正得以顯現。 在前例中,我們以及看到如何将一個度量嵌入桶中,它的功能已經十分強大了。

但真正令人激動的分析來自于将桶嵌套進 另外一個桶 所能得到的結果。 現在,我們想知道每個顔色的汽車制造商的分布:

GET /cars/transactions/_search
{
   "size" : 0,
   "aggs": {
      "colors": {
         "terms": {
            "field": "color"
         },
         "aggs": {
            "avg_price": { 
        
ElasticSearch5.X嵌套桶(三)
"avg": { "field": "price" } }, "make": {
ElasticSearch5.X嵌套桶(三)
"terms": { "field": "make"
ElasticSearch5.X嵌套桶(三)
} } } } } }
ElasticSearch5.X嵌套桶(三)
注意前例中的 

avg_price

 度量仍然保持原位。
ElasticSearch5.X嵌套桶(三)
另一個聚合 

make

 被加入到了 

color

 顔色桶中。
ElasticSearch5.X嵌套桶(三)
這個聚合是 

terms

 桶,它會為每個汽車制造商生成唯一的桶。

這裡發生了一些有趣的事。 首先,我們可能會觀察到之前例子中的 

avg_price

 度量完全沒有變化,還在原來的位置。 一個聚合的每個 層級 都可以有多個度量或桶, 

avg_price

 度量告訴我們每種顔色汽車的平均價格。它與其他的桶和度量互相獨立。

這對我們的應用非常重要,因為這裡面有很多互相關聯,但又完全不同的度量需要收集。聚合使我們能夠用一次資料請求獲得所有的這些資訊。

另外一件值得注意的重要事情是我們新增的這個 

make

 聚合,它是一個 

terms

 桶(嵌套在 

colors

 、 

terms

 桶内)。這意味着它 會為資料集中的每個唯一組合生成( 

color

 、 

make

 )元組。

讓我們看看傳回的響應(為了簡單我們隻顯示部分結果):

{
...
   "aggregations": {
      "colors": {
         "buckets": [
            {
               "key": "red",
               "doc_count": 4,
               "make": { 
        
ElasticSearch5.X嵌套桶(三)
"buckets": [ { "key": "honda",
ElasticSearch5.X嵌套桶(三)
"doc_count": 3 }, { "key": "bmw", "doc_count": 1 } ] }, "avg_price": { "value": 32500
ElasticSearch5.X嵌套桶(三)
} }, ... }
ElasticSearch5.X嵌套桶(三)
正如期望的那樣,新的聚合嵌入在每個顔色桶中。
ElasticSearch5.X嵌套桶(三)
現在我們看見按不同制造商分解的每種顔色下車輛資訊。
ElasticSearch5.X嵌套桶(三)
最終,我們看到前例中的 

avg_price

 度量仍然維持不變。

響應結果告訴我們以下幾點:

  • 紅色車有四輛。
  • 紅色車的平均售價是 $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

繼續閱讀