ElasticSearch 聚合 === [說明](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html) --- Elasticsearch將聚合分為三類: 1. Bucket Aggregations - 根據field的值、範圍或其他條件將documents分組為桶。 1. Metrics Aggregations - 從field的值計算度量,如總和或平均值。 1. Pipeline Aggregations - 匯總其他聚合ouput獲取輸入。 --- # Terms aggregation - 針對某個 field 的值進行分組,field 有幾種值就分成幾組 - terms 桶在進行分組時,會爲此 field 中的每種值創建一個新的桶 [說明](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html) --- 範例1 ```json= GET tb_inc_internal_sync-*/_search { "query": { "match_all": {} }, "size": 0, "aggs": { "my_tran_code": { "terms": { "field": "tran_code.keyword", "min_doc_count": 1, "size": 10, "order": {"_key": "asc"} } } } } ``` 參數: - min_doc_count 限制最低數量 - size 顯示 bucket 中多少筆數據,預設是 10 - order 預設是照doc_count排序 - script 可以使用腳本來組合字段再統計數量 - include/exclude 可以藉由這兩個參數filter設定的條件 <!-- .slide: style="font-size: 26px;" --> --- 處理結果 ```json= "aggregations" : { "my_tran_code" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "05", "doc_count" : 245 }, { "key" : "06", "doc_count" : 31 } ] } } ``` <!-- .slide: style="font-size: 26px;" --> --- 範例2 將 terms 桶搭配度量指標(avg、min、max、sum…)一起使用 ```json= GET tb_inc_internal_sync-*/_search { "query": { "match_all": {} }, "size": 0, "aggs": { "my_tran_code": { "terms": { "field": "tran_code.keyword", "min_doc_count": 0 }, "aggs": { "my_avg_amt": { "avg": { "field": "src_amt" } }, "my_sum_amt": { "sum": { "field": "src_amt" } }, "my_min_amt": { "min": { "field": "src_amt" } } } } } } ``` <!-- .slide: style="font-size: 26px;" --> --- ```json= "aggregations" : { "my_tran_code" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "05", "doc_count" : 245, "my_min_amt" : { "value" : 500.0 }, "my_avg_amt" : { "value" : 2024105.7142857143 }, "my_sum_amt" : { "value" : 4.959059E8 } }, { "key" : "06", "doc_count" : 31, "my_min_amt" : { "value" : 500.0 }, "my_avg_amt" : { "value" : 3990.3225806451615 }, "my_sum_amt" : { "value" : 123700.0 } } ] } } ``` <!-- .slide: style="font-size: 26px;" --> --- # Filter aggregation 範例 ```json= GET tb_inc_internal_sync-*/_search { "size": 0, "aggs": { "my_avg_amt": { "avg": { "field": "src_amt" } }, "my_filter": { "filter": { "term": { "tran_code": "05" } }, "aggs": { "avg_price": { "avg": { "field": "src_amt" } } } } } } ``` 結果 ```json= "aggregations" : { "my_filter" : { "doc_count" : 245, "avg_price" : { "value" : 2024105.7142857143 } }, "my_avg_amt" : { "value" : 1797208.6956521738 } } ``` <!-- .slide: style="font-size: 26px;" --> --- 使用 filters aggregation 做多重過濾 要使用多個過濾器對文檔進行分組,請使用 filters聚合。這比使用多個filter聚合要快。 ```json= POST /sales/_search?size=0&filter_path=aggregations { "aggs": { "f": { "filters": { "filters": { "hats": { "term": { "type": "hat" } }, "t_shirts": { "term": { "type": "t-shirt" } } } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } } } ``` 取代 ```json= POST /sales/_search?size=0&filter_path=aggregations { "aggs": { "hats": { "filter": { "term": { "type": "hat" } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } }, "t_shirts": { "filter": { "term": { "type": "t-shirt" } }, "aggs": { "avg_price": { "avg": { "field": "price" } } } } } } ``` <!-- .slide: style="font-size: 20px;" --> --- # Range aggregation 在聚合過程中,將從每個存儲區範圍中檢查從每個文檔中提取的值,並“存儲”相關/匹配的文檔。 請注意,此聚合包括from值,但不包括to每個範圍的值。 --- 範例 ```json= GET tb_inc_internal_sync-*/_search { "size": 0, "aggs": { "amt_ranges": { "range": { "field": "src_amt", "ranges": [ { "to": 10000 }, { "from": 10000, "to": 20000 }, { "from": 20000 } ] } } } } ``` 結果 ```json= "aggregations" : { "amt_ranges" : { "buckets" : [ { "key" : "*-10000.0", "to" : 10000.0, "doc_count" : 94 }, { "key" : "10000.0-20000.0", "from" : 10000.0, "to" : 20000.0, "doc_count" : 46 }, { "key" : "20000.0-*", "from" : 20000.0, "doc_count" : 136 } ] } } ``` <!-- .slide: style="font-size: 20px;" --> --- # 敬請指教 ----
{"metaMigratedAt":"2023-06-16T00:37:30.568Z","metaMigratedFrom":"Content","title":"ElasticSearch 聚合","breaks":true,"contributors":"[{\"id\":\"565617f1-fa63-410c-9fb9-a9278632bb7a\",\"add\":9092,\"del\":3622}]"}
    266 views