主頁 > 資料庫 > es筆記六之聚合操作之指標聚合

es筆記六之聚合操作之指標聚合

2023-05-25 10:38:29 資料庫

本文首發于公眾號:Hunter后端
原文鏈接:es筆記六之聚合操作之指標聚合

聚合操作,在 es 中的聚合可以分為大概四種聚合:

  • bucketing(桶聚合)
  • mertic(指標聚合)
  • matrix(矩陣聚合)
  • pipeline(管道聚合)

bucket
類似于分類分組,按照某個 key 將符合條件的資料都放到該類別的組中

mertic
計算一組檔案的相關值,比如最大,最小值

matrix
根據多個 key 從檔案中提取值生成矩陣,這個操作不支持腳本(script)

pipeline
將其他聚合的結果再次聚合輸出

聚合是支持套娃(嵌套)操作的,你可以在聚合的結果上接著進行聚合操作,es 是不限制聚合的深度的,

本篇筆記目錄如下:

  1. 指標聚合的基本結構
  2. 平均值聚合
  3. 去重統計
  4. 聚合統計匯總
  5. 最大值、最小值聚合
  6. 百分位統計
  7. 百分位排名
  8. 字串統計聚合
  9. sum 統計總和操作
  10. count 統計總數操作
  11. top hit 操作

1、指標聚合的基本結構

指標聚合操作的基本結構大致如下:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "aggregation_name": {
      "agg_name": {
        "field": "field_name"
      }
    }
  }
}

其中,aggregation_name 為聚合回傳結果的名稱,由我們自己定義,agg_name 為聚合的引數,比如最大值最小值,平均值等,這個我們在下面介紹,

指標聚合

指標聚合是從檔案中提取欄位值出來進行計算得出結果,比如最大最小平均值等,

接下來將詳細介紹各種指標聚合操作,

2、平均值聚合

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "avg_balance": {
      "avg": {
        "field": "balance"
      }
    }
  }
}

其中,最外層的 aggs 表示是聚合操作,avg_balance 是聚合的名稱,avg 則表示是平均值聚合,里面的 field 表示聚合的欄位是 balance 欄位

在這里,如果不添加 size=0,除了會回傳我們的聚合結果,還會回傳聚合的源資料,

這個操作我們回傳的結果如下:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1000,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "avg_balance" : {
      "value" : 25714.837
    }
  }
}

我們聚合的結果在 aggregations 這個 key 下,

腳本執行

腳本執行的方式如下:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "avg_balance": {
      "avg": {
        "script": {"source": "doc.balance.value"}
      }
    }
  }
}

對結果處理

假設,我們需要對這個平均值結果進行處理,比如我們計算出來的這個值是 2000,我們想要對這個值進行修正,比如乘以 1.2,

當然,這個乘的操作我們可以獲取資料之后在系統里進行操作,如果是直接在 es 的處理中,我們可以如下實作:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "avg_corrected_balance": {
      "avg": {
        "field": "balance", 
        "script": {
          "lang": "painless",
          "source": "_value * params.correction",
          "params": {"correction": 1.2}
          
        }
      }
    },
    "avg_balance": {
      "avg": {
        "script": {"source": "doc.balance.value"}
      }
    }
  }
}

在上面的陳述句中,我們新增了一個 params 欄位,定義了一個 correction 的值,然后回傳的結果乘以了這個值,

在這里,我額外加了一個 avg_balance,是直接用的平均值聚合結果,主要是用來對比這兩個結果,

缺失值補充

有一些情況,我們在匯入資料的時候,可能某條資料的某個欄位是沒有值的,默認情況下他們是會被忽略的,不計入計算的,但是如果想要為其加一個默認值也是可以實作的,這里我們用到 missing 這個引數來定義:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "avg_balance": {
      "avg": {
        "field": "balance",
        "missing": 0
      }
    }
  }
}

3、去重統計

是對某個欄位進行去重后統計總數,操作如下:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "age_count": {
      "cardinality": {
        "field": "age"
      }
    }
  }
}

需要注意的是,這個統計對于 text 欄位屬性是不生效的

4、聚合統計匯總

有一個聚合統計匯總的引數 stats,可以將一般的聚合值進行匯總后回傳,比如總數,最大值,最小值等,使用如下:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "age_stats": {
      "stats": {
        "field": "age"
      }
    }
  }
}

可以看到回傳的值如下:

{
 ...
 "aggregations" : {
    "age_stats" : {
      "count" : 1000,
      "min" : 20.0,
      "max" : 40.0,
      "avg" : 30.171,
      "sum" : 30171.0
    }
  }
}

如果還想獲得方差,標準差等資料,可以使用這個引數的擴展版 extended_stats,替換聚合的引數 stats 即可,

5、最大值、最小值聚合

最大值最小值的關鍵字是 max 和 min,使用示例如下:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "max_age": {
      "max": {"field": "age"}
    },
    "min_age": {
      "min": {"field": "age"}
    }
  }
}

使用腳本的方式來實作:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "max_age": {
      "max": {"script": {"source": "doc.age.value"}}
    }
  }
}

6、百分位統計

使用 es 進行百分位的統計,用到的關鍵字是 percentiles

使用示例如下:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "age_percentiles": {
      "percentiles": {
        "field": "age"
      }
    }
  }
}

會輸出 [1, 5, 25, 75, 95, 99] 的統計數:

{
  ...
  "aggregations" : {
    "age_percentiles" : {
      "values" : {
        "1.0" : 20.0,
        "5.0" : 21.0,
        "25.0" : 25.0,
        "50.0" : 30.8,
        "75.0" : 35.0,
        "95.0" : 39.0,
        "99.0" : 40.0
      }
    }
  }
}

我們也可以指定統計的百分位的數串列,比如我們只想知道 [75, 98, 99, 99.9] 的資料:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "age_percentiles": {
      "percentiles": {
        "field": "age",
        "percents": [75, 98, 99, 99.9]
      }
    }
  }
}

我們直接使用是回傳的百分位-資料的格式,我們也可以使用 {'key': xx, 'value': xx} 來回傳一個串列,加上一個引數 keyed=false 即可

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "age_percentiles": {
      "percentiles": {
        "field": "age",
        "keyed": false
      }
    }
  }
}

回傳的結果示例如下:

    "age_percentiles" : {
      "values" : [
         ...
        {
          "key" : 75.0,
          "value" : 35.0
        },
        {
          "key" : 95.0,
          "value" : 39.0
        },
        {
          "key" : 99.0,
          "value" : 40.0
        }
      ]
    }
  }
}

7、百分位排名

這個是和前面的百分位統計相反的操作,

前面是根據百分位獲取該百分位值,這個引數的作用是根據資料獲取在系統中的百分位,使用示例如下:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "age_ranks": {
      "percentile_ranks": {
        "field": "age",
        "values": [
          30,
          35,
          40
        ]
      }
    }
  }
}

8、字串統計聚合

對于字串型別的資料,有一個專門的引數來獲取相應的聚合統計值,為 string_stats

對 lastname 欄位的統計示例如下:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "last_name_stats": {
      "string_stats": {"field": "lastname.keyword"}
    }
  }
}

需要注意,如果我們需要進行統計的欄位如果是 text 欄位,那么就需要加上 .keyword 來進行統計,如果是欄位屬性是 keyword,就不需要這樣處理,

經過統計回傳的資料如下:

  ... 
  "aggregations" : {
    "last_name_stats" : {
      "count" : 1000,
      "min_length" : 2,
      "max_length" : 11,
      "avg_length" : 6.122,
      "entropy" : 4.726472133462717
    }
  }
}

以上資訊包括資料總數,lastname 欄位最長和最短長度,平均長度和熵值

9、sum 統計總和操作

比如我們需要對 bank 這個資料庫的 age 欄位進行 sum 的操作,可以如下操作:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "age_sum": {
      "sum": {"field": "age"}
    }
  }
}

在前面的每一個聚合操作里,都可以進行 query 的條件篩選,比如獲取 age=21 的資料的 sum 值:

GET /bank/_search
{
  "size": 0,
  "query": {"match": {"age": "21"}}, 
  "aggs": {
    "age_sum": {
      "sum": {"field": "age"}
    }
  }
}

10、count 統計總數操作

count 是統計總數,使用示例如下:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "age_count": {
      "value_count": {
        "field": "age"
      }
    }
  }
}

11、top hit 操作

top hit 操作是根據條件回傳符合條件的前幾條資料,通過 size 控制回傳的數量,

我們先來看下下面的這個操作:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "top_ages": {
      "terms": {
        "field": "age",
        "size": 30
      }
    }
  }
}

這個操作其實就是一個桶聚合,它會在下一篇筆記中介紹,這里我們直接用一下,它回傳欄位為 age,以及它在檔案中的數量:

  ...
  "aggregations" : {
    "top_ages" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : 31,
          "doc_count" : 61
        },
        {
          "key" : 39,
          "doc_count" : 60
        },
        {
          "key" : 26,
          "doc_count" : 59
        },
        ...

top_hits 的操作是在第一個 aggs 聚合操作條件下,進行再次聚合,

比如我們想要獲取各個 age 的資料中,按照 balance 欄位進行倒序排序的前三個,我們可以如下操作:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "top_ages": {
      "terms": {
        "field": "age",
        "size": 30
      },
      "aggs": {
        "top_balance_hits": {
          "top_hits": {
            "size": 3,
            "sort": [{"balance": {"order": "desc"}}]
          }
        }
      }
    }
  }
}

然后在第一次聚合回傳的結果中,就會多一個 top_balance_hits 欄位,也就是我們在查詢操作中指定的,其下會有三條按照 balance 欄位倒序回傳的資料:

  ...
  "aggregations" : {
    "top_ages" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : 31,
          "doc_count" : 61,
          "top_balance_hits" : {
            "hits" : {
              "total" : {
                "value" : 61,
                "relation" : "eq"
              },
              "max_score" : null,
              "hits" : [
                ...
              ]
        },
        {
          "key" : 39,
          "doc_count" : 60,
          ...
        },
        {
          "key" : 26,
          "doc_count" : 59,
          ...
        },
        ...

如果想獲取更多后端相關文章,可掃碼關注閱讀:
image

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/553366.html

標籤:其他

上一篇:與世界分享我剛編的mysql http隧道工具-hersql原理與使用

下一篇:返回列表

標籤雲
其他(159667) Python(38169) JavaScript(25450) Java(18123) C(15231) 區塊鏈(8268) C#(7972) AI(7469) 爪哇(7425) MySQL(7211) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5340) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4576) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2403) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1976) 功能(1967) Web開發(1951) HtmlCss(1944) C++(1922) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1878) .NETCore(1861) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • es筆記六之聚合操作之指標聚合

    > 本文首發于公眾號:Hunter后端 > 原文鏈接:[es筆記六之聚合操作之指標聚合](https://mp.weixin.qq.com/s/UyiZ2bzFxi7zCGmL1Xf3CQ) 聚合操作,在 es 中的聚合可以分為大概四種聚合: * bucketing(桶聚合) * mertic(指標 ......

    uj5u.com 2023-05-25 10:38:29 more
  • 與世界分享我剛編的mysql http隧道工具-hersql原理與使用

    原文地址:[https://blog.fanscore.cn/a/53/](https://blog.fanscore.cn/a/53/) # 1. 前言 本文是[與世界分享我剛編的轉發ntunnel_mysql.php的工具](https://blog.fanscore.cn/a/47/)的后續, ......

    uj5u.com 2023-05-25 10:20:04 more
  • 01_MySQL基礎架構

    01_MySQL基礎架構 MySQL 45 講Note: 課程專欄名稱:《MySQL實戰45講》課程 筆記參考:MYSQL45 講 01_基礎架構:一條SQL查詢陳述句是如何執行的? 一條SQL查詢是如何執行的 先看一下下面這個圖 ?? 我們首先理解一下 Mysql 的基礎架構,理解如果執行一條簡單的 ......

    uj5u.com 2023-05-25 09:59:24 more
  • 150萬學術名詞中英對照字典ACCESS資料庫

    今天這個資料是一款字典的型別的軟體,專門用來查詢一些學術上面的名詞的中英對照,超過180個學科分類,150多萬條記錄,伴隨您悠游于學海之中,是您做學問、寫論文的好幫手。 主要科目有:電子計算機名詞(107213)、電機工程名詞(100395)、電力工程(68379)、外國地名譯名(64487)、機械 ......

    uj5u.com 2023-05-25 09:45:21 more
  • Apache Hudi 在袋鼠云資料湖平臺的設計與實踐

    在大資料處理中,[實時資料分析](https://www.dtstack.com/dtengine/easylake?src=https://www.cnblogs.com/DTinsight/archive/2023/05/24/szsm)是一個重要的需求。隨著資料量的不斷增長,對于實時分析的挑戰也在不斷加大,傳統的批處理方式已經不能滿足[實時資料處理](https://www.dtstack.com ......

    uj5u.com 2023-05-25 09:41:05 more
  • Elasticsearch與Clickhouse資料存盤對比

    Elasticsearch的查詢陳述句維護成本較高、在聚合計算場景下出現資料不精確等問題。Clickhouse是列式資料庫,列式型資料庫天然適合OLAP場景,類似SQL語法降低開發和學習成本,采用快速壓縮演算法節省存盤成本,采用向量執行引擎技術大幅縮減計算耗時。所以做此對比,進行Elasticsearc... ......

    uj5u.com 2023-05-25 09:40:45 more
  • 【資料庫】時區及JDBC的時區設定

    JDBC連接時有個TimeZone配置,這玩意到底有用嗎?我是使用Postgresql和Mysql兩個資料庫驗證的。結果如下: 資料庫 部署方式 版本 JDBC連接TimeZone引數 JDBC連接serverTimezone引數 總結 Mysql docker 8.0 沒用 有用,會使用客戶端時區 ......

    uj5u.com 2023-05-25 09:30:15 more
  • es筆記六之聚合操作之指標聚合

    > 本文首發于公眾號:Hunter后端 > 原文鏈接:[es筆記六之聚合操作之指標聚合](https://mp.weixin.qq.com/s/UyiZ2bzFxi7zCGmL1Xf3CQ) 聚合操作,在 es 中的聚合可以分為大概四種聚合: * bucketing(桶聚合) * mertic(指標 ......

    uj5u.com 2023-05-25 09:23:32 more
  • Elasticsearch與Clickhouse資料存盤對比

    Elasticsearch的查詢陳述句維護成本較高、在聚合計算場景下出現資料不精確等問題。Clickhouse是列式資料庫,列式型資料庫天然適合OLAP場景,類似SQL語法降低開發和學習成本,采用快速壓縮演算法節省存盤成本,采用向量執行引擎技術大幅縮減計算耗時。所以做此對比,進行Elasticsearc... ......

    uj5u.com 2023-05-25 09:23:21 more
  • 與世界分享我剛編的mysql http隧道工具-hersql原理與使用

    原文地址:[https://blog.fanscore.cn/a/53/](https://blog.fanscore.cn/a/53/) # 1. 前言 本文是[與世界分享我剛編的轉發ntunnel_mysql.php的工具](https://blog.fanscore.cn/a/47/)的后續, ......

    uj5u.com 2023-05-25 09:22:35 more