天天看點

ElasticSearch 聚合查詢

桶(bucket)和名額(metric)

(1)桶  

  a、簡單來說桶就是滿足特定條件的文檔的集合。

  b、當聚合開始被執行,每個文檔裡面的值通過計算來決定符合哪個桶的條件,如果比對到,文檔将放入相應的桶并接着開始聚合操作。

  c、桶也可以被嵌套在其他桶裡面。

(2)名額

  a、桶能讓我們劃分文檔到有意義的集合,但是最終我們需要的是對這些桶内的文檔進行一些名額的計算。分桶是一種達到目的地的手段:它提供了一種給文檔分組的方法來讓我們可以計算感興趣的名額。

  b、大多數名額是簡單的數學運算(如:最小值、平均值、最大值、彙總),這些是通過文檔的值來計算的。

(3)桶和名額的組合

  聚合是由桶和名額組成的。聚合可能隻有一個桶,可能隻有一個名額,或者可能兩個都有。也有可能一些桶嵌套在其他桶裡面。

使用示例

GET /cars/transactions/_search
{
   "size" : 0,
   "aggs": {
      "colors": {
         "terms": {
            "field": "color"
         },
         "aggs": {
            "avg_price": { "avg": { "field": "price" }
            },
            "make" : {
                "terms" : {
                    "field" : "make"
                },
                "aggs" : { 
                    "min_price" : { "min": { "field": "price"} }, 
                    "max_price" : { "max": { "field": "price"} } 
                }
            }
         }
      }
   }
}
           
{
...
   "aggregations": {
      "colors": {
         "buckets": [
            {
               "key": "red",
               "doc_count": 4,
               "make": {
                  "buckets": [
                     {
                        "key": "honda",
                        "doc_count": 3,
                        "min_price": {
                           "value": 10000 
                        },
                        "max_price": {
                           "value": 20000 
                        }
                     },
                     {
                        "key": "bmw",
                        "doc_count": 1,
                        "min_price": {
                           "value": 80000
                        },
                        "max_price": {
                           "value": 80000
                        }
                     }
                  ]
               },
               "avg_price": {
                  "value": 32500
               }
            },
...
           

繼續閱讀