iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0

在前面我們提到了幾種query,可以幫助查找相關的文檔
不論是單一的leaf query去執行特定範圍
或是透過compound query執行複雜的條件搜尋
目的主要都是查找出我們要的特定文檔

但是如果我們是想要針對我們的資料做一些數據分析呢?
這時就可以使用aggregation進行處理
例如找出特定欄位的平均值
或是找出哪些產品銷量最好等等

在ES中aggregation可以分成3種:

  • metric:根據欄位的值進行計算,如平均或總合
  • bucket:根據欄位的值或是一些特定條件,將文檔進行分組
  • pipeline:輸入的資料不是文檔欄位的值,而是其他aggregation的output

Metric aggregation

  • 分成single-value numeric metric aggregation跟multi-value numeric metric aggregation
    • 前者只會輸出一個結果,後者則是輸出多個計算後的值
  • 以下展示最常使用到的sum, avg, min, max
GET /test_aggregation/_search
{
  "size": 0, //不管有多少文檔匹配 只在意聚合結果
  "aggs": {  // 宣告使用aggregation query
    "total": {
      "sum": { // 定義使用的agg方法
        "field": "total_amount" // 目標欄位
      }
    },
    "avg": {
      "avg": {
        "field": "total_amount"
      }
    },
    "min": {
      "min": {
        "field": "total_amount"
      }
    },
    "max": {
      "max": {
        "field": "total_amount"
      }
    }
  }
}

// 返回結果
"aggregations": {
    "total": {
      "value": 1000
    },
    "min": {
      "value": 10
    },
    "avg": {
      "value": 11
    },
    "max": {
      "value": 100
    }

此外還有其他方法,因為真的太多了所以我這邊只挑其中一些說明

aggregation方法 類型 功能
cardinality single-value 計算欄位有多少種值,也就是非重複的數有多少。但是只是近似值,不是絕對精確
value_count single-value 計算欄位總共有多少筆資料,不會考慮到有無重複
stats multi-value 會直接計算出該欄位的min, max, sum, count
boxplot multi-value 四分位數,返回min, max, q1, q2, q3以及lower跟upper
extended_stats multi-value stats的延伸,返回更多數據分析結果,如標準差等等

這邊特別提及一下t-test,簡而言之就是判斷兩組數據有沒有顯著差異

{
  "t_test": {
    "a": "value_before",
    "b": "value_after",
    "type": "paired"
  }
}
  • 一般寫法如上圖,a與b就是兩組要比較的numeric field,而type則有以下幾種檢定方式
    • paired:執行paired t-test
    • homoscedastic:equal variance的兩組樣本
    • heteroscedastic:默認值,unequal variance的兩組樣本
  • 返回的結果就是p-value
  • 而我們也能透過調整filter來更近一步篩選我們要使用的樣本
"t_test": {
	"a": {
		"field": "",         
			"filter": {
        "term": {"": ""}
        }
      },
	"b": {
	  "field": "",         
		  "filter": {
	      "term": {"": ""}
        }
     },
  "type": "heteroscedastic"                 
}

Bucket aggregations

  • 根據不同條件將各個文檔分成不同的bucket,跟metric是要算出特定值不同,主要是要進行分類
  • 並且也會依據使用的方法不同而產出一至多個sub_bucket

這邊介紹其中2種用法:terms與range(object相關的明天介紹)
terms:

  • multi-bucket value類型
  • 會依據term query來區分欄位中不同的值來進行分組
  • 返回結果如下圖
{
  ...
  "aggregations": {
    "genres": {
      "doc_count_error_upper_bound": 0,   
      "sum_other_doc_count": 0,           
      "buckets": [                        
        {
          "key": "electronic",
          "doc_count": 6
        },
        {
          "key": "rock",
          "doc_count": 3
        },
        {
          "key": "jazz",
          "doc_count": 2
        }
      ]
    }
  }
}
  • 預設情形會返回文檔數最多的前10種term
    • 可以用size參數來控制最多幾種
      • 超過1000種可以使用composite aggregation但是非常耗資源
      • size的設置也受到search.max_buckets的限制
  • 為了避免可能特定shard內文檔的種類太低,會低於size設定
    • 避免多花資源在去另外找需求的size數
    • 會獲取 size * 1.5 + 10的種類
  • sum_other_doc_count:代表shard_size有找到比size更多種的term
  • doc_count_error_upper_bound:代表shard中有很多資料,並且大於shard_size
  • 出來的分組預設是按照_count進行排列,也可以透過更改order參數來調整排序
    • 避免使用"order": { "_count": "asc" } ,因爲terms aggregation挑選資料的機制,結果很容易是錯誤的
    • 如果想找稀有的值,可以用rare_term aggregations
GET /_search
{
  "aggs": {
    "genres": {
      "terms": {
        "field": "genre",
        "order": { "max_play_count": "desc" }
      },
      "aggs": {
        "max_play_count": { "max": { "field": "play_count" } }
      }
    }
  }
}

range:

  • multi-bucket value類型
  • 根據ranges參數提供內部的array來判斷應該在哪些數據範圍分組
  • 以下為範例:
"range": {
	"field": "",
	"ranges": [
		{"to": 100}, {"from": 100, "to": 200}, {"from": 200}
		// to是 < 
    // from則是 >=
	]
}

今天就先介紹這兩種aggregations方法

metric aggregation幫助我們在分析我們的資料時

除了一般的數據計算外,也能處理統計分析等形式

讓我們更深入了解我們資料彼此之間的關係

並且也能透過bucket aggregation去藉由不同條件來將資料進行分組

明天會介紹pipeline aggregation

並且會介紹aggregation使用上時,可以設定的其他參數跟其他需要注意的細節與~

參考資料
aggregation:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html
metric aggregation:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics.html
bucket aggregation:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket.html
terms aggregation:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#terms-agg-doc-count-error


上一篇
【Day 19】由淺入深來探討Elasticsearch - Compound queries
下一篇
【Day 21】由淺入深來探討Elasticsearch - Aggregation (2)
系列文
由淺入深來探討Elasticsearch,從基礎語法到底層相關原理30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言