Elasticsearch聚合查詢說明
Elasticsearch聚合查詢是一種強(qiáng)大的工具,允許我們對索引中的數(shù)據(jù)進(jìn)行復(fù)雜的統(tǒng)計(jì)分析和計(jì)算。本文將詳細(xì)解釋一個(gè)聚合查詢示例,該查詢用于統(tǒng)計(jì)滿足特定條件的文檔數(shù)量,并計(jì)算其占總文檔數(shù)量的百分比。這里回會(huì)分享如何統(tǒng)計(jì)某個(gè)字段的空值率,然后擴(kuò)展介紹ES的一些基礎(chǔ)知識。

es
空值率查詢DSL
此查詢結(jié)構(gòu)通過 GET /my_index/_search 發(fā)送到 Elasticsearch,以實(shí)現(xiàn)對索引 my_index 的聚合分析。查詢分為以下幾個(gè)部分:
{
"size": 0, // 不返回任何搜索結(jié)果,只聚合數(shù)據(jù)
"aggs": {
"all_documents_agg": { // 聚合所有文檔
"terms": {
"script": {
"source": "return 'all_documents';" // 強(qiáng)制所有文檔聚合到一個(gè)桶中
}
},
"aggs": {
"total_count": { // 統(tǒng)計(jì)所有文檔的數(shù)量
"value_count": {
"field": "_id" // 使用文檔的ID字段進(jìn)行計(jì)數(shù)
}
},
"filtered_count": { // 統(tǒng)計(jì)滿足特定條件的文檔數(shù)量
"value_count": {
"script": {
"source": "if (doc['my_field'].size() != 0 && doc['my_field'].value != '') return 1" // 統(tǒng)計(jì)字段 'my_field' 非空且非零的文檔數(shù)量
}
}
},
"percentage_agg": { // 計(jì)算滿足特定條件的文檔數(shù)量占總文檔數(shù)量的百分比
"bucket_script": {
"buckets_path": {
"totalCount": "total_count", // 引用所有文檔的數(shù)量
"filteredCount": "filtered_count" // 引用滿足特定條件的文檔數(shù)量
},
"script": "params.filteredCount / params.totalCount * 100" // 計(jì)算百分比
}
}
}
}
}
}
聚合部分詳解
-
size: 0:此設(shè)置意味著查詢不會(huì)返回具體的搜索結(jié)果,而是僅執(zhí)行聚合分析。 -
aggs(聚合):定義了一個(gè)名為 all_documents_agg 的聚合。-
terms:使用 script 將所有文檔強(qiáng)制聚合到一個(gè)名為 all_documents 的桶中。 -
aggs:在 all_documents 桶內(nèi),定義了三個(gè)子聚合:-
total_count:使用 value_count 統(tǒng)計(jì)所有文檔的數(shù)量,基于文檔的 _id 字段。 -
filtered_count:使用 value_count 統(tǒng)計(jì)滿足特定條件的文檔數(shù)量。條件是字段 my_field 非空且非零。 -
percentage_agg:使用 bucket_script 計(jì)算滿足特定條件的文檔數(shù)量占總文檔數(shù)量的百分比。此聚合使用 total_count 和 filtered_count 的結(jié)果,并通過 params.filteredCount / params.totalCount * 100 計(jì)算百分比。
-
-
Elasticsearch聚合基礎(chǔ)知識擴(kuò)展
Elasticsearch聚合概念
Elasticsearch 的聚合功能類似于 SQL 中的 GROUP BY 語句,允許我們對數(shù)據(jù)進(jìn)行分組和計(jì)算統(tǒng)計(jì)信息。聚合主要分為以下幾類:
-
Metric Aggregations(度量聚合):計(jì)算數(shù)值,例如計(jì)數(shù)、平均值、最大值、最小值等。例如,value_count 就是一個(gè)度量聚合,用于計(jì)算特定字段的值的數(shù)量。 -
Bucket Aggregations(桶聚合):將文檔分組到不同的桶中。每個(gè)桶都可以包含一個(gè)或多個(gè)文檔。例如,terms 聚合將文檔根據(jù)特定字段的值進(jìn)行分組。 -
Pipeline Aggregations(管道聚合):對其它聚合的結(jié)果進(jìn)行進(jìn)一步計(jì)算。例如,bucket_script 可以對多個(gè)聚合結(jié)果進(jìn)行自定義計(jì)算。
Script 用法
在 Elasticsearch 中,腳本可以用于在查詢和聚合中執(zhí)行動(dòng)態(tài)計(jì)算。在上述查詢中,腳本用于兩個(gè)地方:
-
terms聚合中的 script:將所有文檔強(qiáng)制聚合到一個(gè)桶中。 -
filtered_count的條件判斷:檢查字段 my_field 是否非空且非零。 -
bucket_script聚合:計(jì)算滿足條件的文檔數(shù)量占總文檔數(shù)量的百分比。
使用腳本可以提供更大的靈活性,但需要注意性能和安全性問題。
Elasticsearch聚合查詢語法
Elasticsearch(ES)提供了豐富的聚合功能,用于對數(shù)據(jù)進(jìn)行統(tǒng)計(jì)和分析。以下是一些常見的聚合類型及其示例:
指標(biāo)聚合(Metric Aggregations)
-
sum:計(jì)算數(shù)值字段的總和。 -
avg:計(jì)算數(shù)值字段的平均值。 -
min:查找數(shù)值字段的最小值。 -
max:查找數(shù)值字段的最大值。 -
extended_stats:獲取數(shù)值字段的多個(gè)統(tǒng)計(jì)數(shù)據(jù)(平均值、最大值、最小值、總和、方差等)。 -
value_count:計(jì)算字段的非空值數(shù)量。
示例:
{
"aggs": {
"my_sum_agg": {
"sum": {
"field": "numeric_field"
}
},
"my_avg_agg": {
"avg": {
"field": "numeric_field"
}
}
}
}
桶聚合(Bucket Aggregations)
-
date_histogram:基于時(shí)間范圍將文檔分組為多個(gè)桶。 -
histogram:基于數(shù)值字段將文檔分組為多個(gè)桶。 -
terms:基于字符串或數(shù)值字段將文檔分組為多個(gè)桶。 -
filters:將文檔分組為多個(gè)桶,每個(gè)桶對應(yīng)一組過濾條件。
示例:
{
"aggs": {
"my_date_histogram_agg": {
"date_histogram": {
"field": "timestamp",
"interval": "1d"
}
},
"my_terms_agg": {
"terms": {
"field": "category_field"
}
}
}
}
矩陣聚合(Matrix Aggregations)
-
matrix_stats:計(jì)算多個(gè)數(shù)值字段的統(tǒng)計(jì)數(shù)據(jù)(如相關(guān)性、協(xié)方差、方差等)。
示例:
{
"aggs": {
"my_matrix_stats_agg": {
"matrix_stats": {
"fields": ["numeric_field1", "numeric_field2"]
}
}
}
}
組合聚合(Pipeline Aggregations)
-
derivative:計(jì)算聚合結(jié)果的導(dǎo)數(shù)。 -
cumulative_sum:計(jì)算聚合結(jié)果的累積和。 -
bucket_script:在多個(gè)桶聚合結(jié)果上執(zhí)行腳本。 -
bucket_selector:根據(jù)腳本選擇或排除特定桶。
示例:
{
"aggs": {
"my_terms_agg": {
"terms": {
"field": "category_field"
},
"aggs": {
"my_avg_agg": {
"avg": {
"field": "numeric_field"
}
},
"my_bucket_script_agg": {
"bucket_script": {
"buckets_path": {
"avgField": "my_avg_agg"
},
"script": "params.avgField * 2"
}
}
}
}
}
}
原文地址:Elasticsearch如何聚合查詢多個(gè)統(tǒng)計(jì)值,如何嵌套聚合?并相互引用,統(tǒng)計(jì)索引中某一個(gè)字段的空值率?語法是怎么樣的