Elasticsearch 系列(五)- 數據聚合

来源:https://www.cnblogs.com/xyh9039/p/18093166
-Advertisement-
Play Games

本章將和大家分享 Elasticsearch 中的數據聚合功能,通過聚合(aggregations)可以實現對文檔數據的統計、分析、運算。 ...


本章將和大家分享 Elasticsearch 中的數據聚合功能,通過聚合(aggregations)可以實現對文檔數據的統計、分析、運算。

一、數據聚合-聚合的分類

聚合(aggregations)可以實現對文檔數據的統計、分析、運算。聚合的官方文檔地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html

聚合常見的有三類:

1)桶(Bucket)聚合:用來對文檔做分組

  • TermAggregation:按照文檔欄位值分組
  • Date Histogram:按照日期階梯分組,例如:一周為一組,或者一月為一組。

2)度量(Metric)聚合:用於計算一些值,比如:最大值、最小值、平均值等。

  • Avg:求平均值
  • Max:求最大值
  • Min:求最小值
  • Stats:同時求max、min、avg、sum等。

3)管道(Pipeline)聚合:以其它聚合的結果為基礎做聚合。

總結:

1)什麼是聚合?

  • 聚合是對文檔數據的統計、分析、計算

2)聚合的常見種類有哪些?

  • Bucket:對文檔數據分組,並統計每組數量
  • Metric:對文檔數據做計算,例如:avg
  • Pipeline:基於其它聚合結果再做聚合

3)參與聚合的欄位類型不能是 text(可分詞的文本)類型,可以是:keyword、數值、日期、布爾類型。

二、數據聚合-DSL實現Bucket聚合

1、DSL實現Bucket聚合

現在,我們要統計所有數據中的酒店品牌有幾種,此時可以根據酒店品牌的名稱做聚合。

類型為term類型,DSL示例:

# 聚合功能
GET /hotel/_search
{
  "size": 0, //設置size為0,結果中不包含文檔,只包含聚合結果
  "aggs": { //定義聚合
    "brandAgg": { //給聚合起個名字
      "terms": { //聚合的類型,按照品牌值聚合,所以選擇term
        "field": "brand", //參與聚合的欄位
        "size": 10 //希望獲取的聚合結果數量
      }
    }
  }
}

運行結果如下:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 201,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "brandAgg" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 39,
      "buckets" : [
        {
          "key" : "7天酒店",
          "doc_count" : 30
        },
        {
          "key" : "如家",
          "doc_count" : 30
        },
        {
          "key" : "皇冠假日",
          "doc_count" : 17
        },
        {
          "key" : "速8",
          "doc_count" : 15
        },
        {
          "key" : "萬怡",
          "doc_count" : 13
        },
        {
          "key" : "華美達",
          "doc_count" : 13
        },
        {
          "key" : "和頤",
          "doc_count" : 12
        },
        {
          "key" : "萬豪",
          "doc_count" : 11
        },
        {
          "key" : "喜來登",
          "doc_count" : 11
        },
        {
          "key" : "希爾頓",
          "doc_count" : 10
        }
      ]
    }
  }
}

2、Bucket聚合-聚合結果排序

預設情況下,Bucket聚合會統計Bucket內的文檔數量,記為_count,並且按照_count降序排序。

我們可以修改結果排序方式:

# 聚合功能,自定義排序規則
GET /hotel/_search
{
  "size": 0,
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "size": 10,
        "order": {
          "_count": "asc" //按照_count升序排列
        }
      }
    }
  }
}

運行結果如下:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 201,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "brandAgg" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 130,
      "buckets" : [
        {
          "key" : "萬麗",
          "doc_count" : 2
        },
        {
          "key" : "麗笙",
          "doc_count" : 2
        },
        {
          "key" : "君悅",
          "doc_count" : 4
        },
        {
          "key" : "豪生",
          "doc_count" : 6
        },
        {
          "key" : "維也納",
          "doc_count" : 7
        },
        {
          "key" : "凱悅",
          "doc_count" : 8
        },
        {
          "key" : "希爾頓",
          "doc_count" : 10
        },
        {
          "key" : "漢庭",
          "doc_count" : 10
        },
        {
          "key" : "萬豪",
          "doc_count" : 11
        },
        {
          "key" : "喜來登",
          "doc_count" : 11
        }
      ]
    }
  }
}

3、Bucket聚合-限定聚合範圍

預設情況下,Bucket聚合是對索引庫的所有文檔做聚合,我們可以限定要聚合的文檔範圍,只要添加query條件即可。

示例:

# 聚合功能,限定聚合範圍
GET /hotel/_search
{
  "query": {
    "range": {
      "price": {
        "lte": 200 //只對200元以下的文檔聚合
      }
    }
  },
  "size": 0,
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "size": 10,
        "order": {
          "_count": "asc"
        }
      }
    }
  }
}

運行結果如下:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 17,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "brandAgg" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "7天酒店",
          "doc_count" : 1
        },
        {
          "key" : "漢庭",
          "doc_count" : 1
        },
        {
          "key" : "速8",
          "doc_count" : 2
        },
        {
          "key" : "如家",
          "doc_count" : 13
        }
      ]
    }
  }
}

4、總結

1)aggs代表聚合,與query同級,此時query的作用是?

  • 限定聚合的的文檔範圍

2)聚合必須的三要素是什麼?

  • 聚合名稱
  • 聚合類型
  • 聚合欄位

3)聚合可配置屬性有哪些?

  • size:指定聚合結果數量
  • order:指定聚合結果排序方式
  • field:指定聚合欄位

三、數據聚合-DSL實現Metric聚合

例如:我們要求獲取每個品牌的用戶評分的min、max、avg等值。

我們可以利用stats聚合:

# 嵌套聚合Metric
GET /hotel/_search
{
  "size": 0,
  "aggs": {
    "brandAgg": {
      "terms": {
        "field": "brand",
        "size": 10,
        "order": {
          "scoreAgg.avg": "desc" //對桶裡面的數據做排序
        }
      },
      "aggs": { //是brandAgg聚合的子聚合,也就是分組後對每組分別計算
        "scoreAgg": { //聚合名稱
          "stats": { //聚合類型,這裡stats可以計算min、max、avg等
            "field": "score" //聚合欄位,這裡是score
          }
        }
      }
    }
  }
}

運行結果如下所示:

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 201,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "brandAgg" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 111,
      "buckets" : [
        {
          "key" : "萬麗",
          "doc_count" : 2,
          "scoreAgg" : {
            "count" : 2,
            "min" : 46.0,
            "max" : 47.0,
            "avg" : 46.5,
            "sum" : 93.0
          }
        },
        {
          "key" : "凱悅",
          "doc_count" : 8,
          "scoreAgg" : {
            "count" : 8,
            "min" : 45.0,
            "max" : 47.0,
            "avg" : 46.25,
            "sum" : 370.0
          }
        },
        {
          "key" : "和頤",
          "doc_count" : 12,
          "scoreAgg" : {
            "count" : 12,
            "min" : 44.0,
            "max" : 47.0,
            "avg" : 46.083333333333336,
            "sum" : 553.0
          }
        },
        {
          "key" : "麗笙",
          "doc_count" : 2,
          "scoreAgg" : {
            "count" : 2,
            "min" : 46.0,
            "max" : 46.0,
            "avg" : 46.0,
            "sum" : 92.0
          }
        },
        {
          "key" : "喜來登",
          "doc_count" : 11,
          "scoreAgg" : {
            "count" : 11,
            "min" : 44.0,
            "max" : 48.0,
            "avg" : 46.0,
            "sum" : 506.0
          }
        },
        {
          "key" : "皇冠假日",
          "doc_count" : 17,
          "scoreAgg" : {
            "count" : 17,
            "min" : 44.0,
            "max" : 48.0,
            "avg" : 46.0,
            "sum" : 782.0
          }
        },
        {
          "key" : "萬豪",
          "doc_count" : 11,
          "scoreAgg" : {
            "count" : 11,
            "min" : 43.0,
            "max" : 47.0,
            "avg" : 45.81818181818182,
            "sum" : 504.0
          }
        },
        {
          "key" : "萬怡",
          "doc_count" : 13,
          "scoreAgg" : {
            "count" : 13,
            "min" : 44.0,
            "max" : 48.0,
            "avg" : 45.69230769230769,
            "sum" : 594.0
          }
        },
        {
          "key" : "君悅"	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在 Python 2 中,str.format() 函數可以使用一些高級的格式化選項,下麵是一些常用的高級用法: 1. 格式化數字 可以使用格式化選項來控制數字的顯示方式,例如: # 將數字格式化為帶千位分隔符的字元串 n = 1234567 s = "{:,}".format(n) print(s ...
  • 概述 最近項目組在準備接入各種指標監控系統,筆者負責的部分剛好涉及到了 Druid,故記錄一下在過程中遇到的各種情況和坑。 1. 直接使用 Druid 直接使用 Druid 的監控功能,需要直接將它提供的 Servlet 配置到 Web 容器中。具體可以直接參照官方文檔。 配置信息採集:https: ...
  • 此系列文章逐個內容講解ET8.1的新特性。 ET8.1 發佈,帶來以下新特性: 1. 多線程多進程架構,架構更加靈活強大,多線程設計詳細內容請看多線程設計課程 2. 抽象出纖程(Fiber)的概念,類似erlang的進程,非常輕鬆的創建多個纖程,利用多核,仍然是單線程開發的體驗 3. 纖程調度: 主 ...
  • 開發了TensorRT C# API 2.0版本,該版本在開發時充分考慮了上一版本應用時出現的問題,併進行了改進。同時在本版本中,我們對介面進行了優化,使用起來更加簡單,並同時提供了相關的應用案例,方便開發者進行使用。 ...
  • 前面我們使用了IIncrementalGenerator來生成代碼,接下來我們來詳細瞭解下IIncrementalGenerator的核心部分IncrementalValueProvider。 介紹 IncrementalValueProvider是基於管道的模式,將我們需要的數據進行處理轉換後傳遞 ...
  • 前言 在WPF應用程式開發中,我們可以藉助其強大靈活的設計能力打造出絢麗而富有創意的用戶界面。然而,與這種高度定製化的界面相比,標準MessageBox卻顯得有些原始和古老。它的外觀與現代、絢麗的應用界面格格不入,使得用戶在交互中可能感到突兀或不符合預期。 本文將深入探討如何在WPF中封裝自定義Me ...
  • socket在接收數據時,經常會因為網路延遲、緩存區數據處理不及時等原因造成收到的數據是多個包黏在一起的情況。如下圖所示 圖中紅色框部分是通訊的 心跳包 圖中黃色框部分和未框選部分是 兩包 數據包 所以可見此時緩存區裡面同時存在了一個心跳包,兩個數據包 如何分包(此處僅針對幾個完整的數據包在一起的情 ...
  • 首先看完成效果 一個玩家的效果 多個玩家的效果 源碼地址 https://gitee.com/chesterdotchen/snake-with-orleans 項目介紹 Snake.Common項目 IGameGrain:游戲的Grain定義,與State定義 ISnakeGrain:蛇的Grai ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...