Elasticsearch聚合

框架集合由搜索查詢選擇的所有數據。框架中包含許多構建塊,有助於構建複雜的數據描述或摘要。聚合的基本結構如下所示 -

"aggregations" : {
   "<aggregation_name>" : {
      "<aggregation_type>" : {
         <aggregation_body>
      }

      [,"meta" : { [<meta_data_body>] } ]?
      [,"aggregations" : { [<sub_aggregation>]+ } ]?
   }
}

有以下不同類型的聚合,每個都有自己的目的 -

指標聚合

這些聚合有助於從聚合文檔的字段值計算矩陣,並且某些值可以從腳本生成。
數字矩陣或者是平均聚合的單值,或者是像stats一樣的多值。

平均聚合

此聚合用於獲取聚合文檔中存在的任何數字字段的平均值。 例如,

POST http://localhost:9200/schools/_search

請求正文

{
   "aggs":{
      "avg_fees":{"avg":{"field":"fees"}}
   }
}

響應

{
   "took":44, "timed_out":false, "_shards":{"total":5, "successful":5, "failed":0},
   "hits":{
      "total":3, "max_score":1.0, "hits":[
         {
            "_index":"schools", "_type":"school", "_id":"2", "_score":1.0,
            "_source":{
               "name":"Saint Paul School", "description":"ICSE Affiliation",
               "street":"Dawarka", "city":"Delhi", "state":"Delhi", 
               "zip":"110075", "location":[28.5733056, 77.0122136], "fees":5000, 
               "tags":["Good Faculty", "Great Sports"], "rating":"4.5"
            }
         },

         {
            "_index":"schools", "_type":"school", "_id":"1", "_score":1.0,
            "_source":{
               "name":"Central School", "description":"CBSE Affiliation",
               "street":"Nagan", "city":"paprola", "state":"HP", "zip":"176115",
               "location":[31.8955385, 76.8380405], "fees":2200, 
               "tags":["Senior Secondary", "beautiful campus"], "rating":"3.3"
            }
         },

         {
            "_index":"schools", "_type":"school", "_id":"3", "_score":1.0,
            "_source":{
               "name":"Crescent School", "description":"State Board Affiliation",
               "street":"Tonk Road", "city":"Jaipur", "state":"RJ", 
               "zip":"176114", "location":[26.8535922, 75.7923988], "fees":2500, 
               "tags":["Well equipped labs"], "rating":"4.5"
            }
         }
      ]
   }, "aggregations":{"avg_fees":{"value":3233.3333333333335}}
}

如果該值不存在於一個或多個聚合文檔中,則默認情況下將忽略該值。您可以在聚合中添加缺少的字段,將缺少值視爲默認值。

{
   "aggs":{
      "avg_fees":{
         "avg":{
            "field":"fees"
            "missing":0
         }
      }
   }
}

基數聚合

此聚合給出特定字段的不同值的計數。 例如,

POST http://localhost:9200/schools*/_search

請求正文

{
   "aggs":{
      "distinct_name_count":{"cardinality":{"field":"name"}}
   }
}

響應

………………………………………………
{
   "name":"Government School", "description":"State Board Afiliation",
   "street":"Hinjewadi", "city":"Pune", "state":"MH", "zip":"411057",
   "location":[18.599752, 73.6821995], "fees":500, "tags":["Great Sports"], 
   "rating":"4"
},

{
   "_index":"schools_gov", "_type": "school", "_id":"1", "_score":1.0,
   "_source":{
      "name":"Model School", "description":"CBSE Affiliation", "street":"silk city",
      "city":"Hyderabad", "state":"AP", "zip":"500030", 
      "location":[17.3903703, 78.4752129], "fees":700, 
      "tags":["Senior Secondary", "beautiful campus"], "rating":"3"
   }
}, "aggregations":{"disticnt_name_count":{"value":3}}
………………………………………………

注 - 基數的值爲3,因爲名稱 - Government, School 和 Model中有三個不同的值。

擴展統計聚合

此聚合生成聚合文檔中特定數字字段的所有統計信息。 例如,

POST http://localhost:9200/schools/school/_search

請求正文

{
   "aggs" : {
      "fees_stats" : { "extended_stats" : { "field" : "fees" } }
   }
}

響應

{
   "aggregations":{
      "fees_stats":{
         "count":3, "min":2200.0, "max":5000.0, 
         "avg":3233.3333333333335, "sum":9700.0,
         "sum_of_squares":3.609E7, "variance":1575555.555555556, 
         "std_deviation":1255.2113589175156,

         "std_deviation_bounds":{
            "upper":5743.756051168364, "lower":722.9106154983024
         }
      }
   }
}

最大聚合

此聚合查找聚合文檔中特定數字字段的最大值。 例如,

POST http://localhost:9200/schools*/_search

請求正文

{
   "aggs" : {
      "max_fees" : { "max" : { "field" : "fees" } }
   }
}

響應

{
   aggregations":{"max_fees":{"value":5000.0}}
}

最小聚合

此聚合查找聚合文檔中特定數字字段的最小值。 例如,

POST http://localhost:9200/schools*/_search

請求正文

{
   "aggs" : {
      "min_fees" : { "min" : { "field" : "fees" } }
   }
}

響應

"aggregations":{"min_fees":{"value":500.0}}

總和聚合

此聚合計算聚合文檔中特定數字字段的總和。 例如,

POST http://localhost:9200/schools*/_search

請求正文

{
   "aggs" : {
      "total_fees" : { "sum" : { "field" : "fees" } }
   }
}

響應

"aggregations":{"total_fees":{"value":10900.0}}

在特殊情況下使用的一些其他度量聚合,例如地理邊界聚集和用於地理位置的地理中心聚集。

桶聚合

這些聚合包含用於具有標準的不同類型的桶聚合,該標準確定文檔是否屬於某一個桶。桶聚合已經在下面描述 -

子聚集

此存儲桶聚合會生成映射到父存儲桶的文檔集合。類型參數用於定義父索引。 例如,我們有一個品牌及其不同的模型,然後模型類型將有以下_parent字段 -

{
   "model" : {
      "_parent" : {
         "type" : "brand"
      }
   }
}

還有許多其他特殊的桶聚合,這在許多其他情況下是有用的,它們分別是 -

  • 日期直方圖彙總/聚合
  • 日期範圍彙總/聚合
  • 過濾聚合
  • 過濾器聚合
  • 地理距離聚合
  • GeoHash網格聚合
  • 全局彙總
  • 直方圖聚合
  • IPv4範圍聚合
  • 失蹤聚合
  • 嵌套聚合
  • 範圍聚合
  • 反向嵌套聚合
  • 採樣器聚合
  • 重要條款聚合
  • 術語聚合

聚合元數據

可以通過使用元標記在請求時添加關於聚合的一些數據,並可以獲得響應。 例如,

POST http://localhost:9200/school*/report/_search

請求正文

{
   "aggs" : {
      "min_fees" : { "avg" : { "field" : "fees" } ,
         "meta" :{
            "dsc" :"Lowest Fees"
         }
      }
   }
}

響應

{
   "aggregations":{"min_fees":{"meta":{"dsc":"Lowest Fees"}, "value":2180.0}}
}