ElastaticSearch---- es聚合查詢


聚合(Aggregation)概念

  1. Bucket Aggregation, 桶聚合,即將穩定按照特定列的值分到不同桶中

  2. Metric Aggregation, 度量聚合,對文檔數據的聚合結果進行運算,類似SQL中的聚合函數(比如 max min avg 等)

  3. Pipeline Aggregation,管道聚合,對聚合結果進行二次聚合

  4. Matrix Aggreagation,矩陣聚合,提供對多個字段聚合操作的支持

Bucket Aggregation(桶聚合):

  • 按terms聚合(類似於mysql分組group by):

格式如下:

聚合名稱可以自己定義,建議用'_'線來分隔單詞,比如test_terms。

{
    "size" : 0,   
    "aggs" : {    
        "自已命名的聚合名稱,比如test_terms" : {   
            "terms" : { 
              "field" : "字段名稱",
              "size" : 10000,
              "order" : {
                 "_term" : "asc"
              }
            }
        }
    }
}

解釋如下:

size:第一個size,為0表示不需要返回文檔,所以直接設置為0可以提高查詢速度。

aggs:aggs是aggregations的縮寫,可以寫全稱也可以縮寫。

聚合名稱:在aggs內部,需要自己定義一個聚合的名稱,建議用'_'線來分隔單詞。在返回的結果中也會用這個變量名來儲存數值的。

terms:定義單個桶(集合)的類型為 terms,按里面的field 字段進行分類,類似於sql中的group by 

terms size: terms里面包含的size,默認為10,表示返回聚合查詢結果的條數。。

比如設置size為50,對指定的字段名稱聚合分組求和后,就只會返回50條。這里的size最好不要設置為0。

order: 排序。{ "_term" : "asc" }表示按照聚合的字段名稱field進行升序排列。

比如對指定的字段名稱order_date聚合分組求和后,想按照order_date升序排列,就可以使用這種方式。

{ "_count" : "asc" }表示按照doc_count(文檔數量)排序。默認是按照doc_count排序。


返回結果,如下所示:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 3,
    "successful": 3,
    "failed": 0
  },
  "hits": {
    "total": 19,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "自己命名的聚合名稱": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "14",
          "doc_count": 16
        },
        {
          "key": "10",
          "doc_count": 3
        }
      ]
    }
  }
}

解釋如下:

  Buckets(桶/集合):滿足特定條件的文檔的集合。
	
  hits: hits為空,因為設置了返回的文檔數量(size)為0,所以在這個文檔里面是不會包含具體的文檔的。
  
  key:按照指定的字段分組后的字段內容。
  
  doc_count:各個分組的數量。

Metric Aggregation(度量聚合)

類似於mysql分組統計。

比如,分組求平均值avg,求最大max,最小min等。

聚合名稱1和2需要自己命名,同樣會在返回結果中顯示。

{
   "size" : 0,
   "aggs": {
      "自己命名的聚合名稱1": {
         "terms": {
            "field": "字段名稱",
            "size" : 10000
         },
         "aggs": { 
            "自己命名的聚合名稱2": { 
               "avg": {
                  "field": "字段名稱" 
               }
            }
         }
      }
   }
}

返回結果如下:

  "aggregations": {
    "聚合名稱1": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "14",
          "doc_count": 16,
          "聚合名稱2": {
            "value": 33156.1875			//這個value就是avg求得的平均值。
          }
        },
        {
          "key": "10",
          "doc_count": 3,
          "聚合名稱2": {
            "value": 662962.3333333334
          }
        }
      ]
    }


另外還有一個stas聚合,可以返回包括min,max,avg,sum,count等統計信息。

{
 "size" : 0, 
 "aggs": {
    "自己命名的聚合名稱1": {
      "terms": {
        "field": "字段名稱1",
        "size": 10
      }, "aggs": {
          "自己命名的聚合名稱2": {
            "stats": {
              "field": "字段名稱2"
          }
        }
      }
      
    }
  }
}    

返回的結果類似如下:

  "aggregations": {
    "dateGrup": {
      "doc_count_error_upper_bound": 0,
      "sum_other_doc_count": 0,
      "buckets": [
        {
          "key": "2020-10-10",
          "doc_count": 19739,
          "pick_num": {
            "count": 17346,
            "min": 1,
            "max": 36148,
            "avg": 55.61362850224836,
            "sum": 964674
          }
        }]

參考資料:

http://blog.itpub.net/29715045/viewspace-2653369/

https://blog.csdn.net/qq_29580525/article/details/80908523

https://www.cnblogs.com/ghj1976/p/5293250.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM