Elasticsearch聚合查詢是一種強大的工具,允許我們對索引中的數據進行複雜的統計分析和計算。本文將詳細解釋一個聚合查詢示例,該查詢用於統計滿足特定條件的文檔數量,並計算其占總文檔數量的百分比。這裡回會分享如何統計某個欄位的空值率,然後擴展介紹ES的一些基礎知識。 ...
目錄
Elasticsearch聚合查詢說明
Elasticsearch聚合查詢是一種強大的工具,允許我們對索引中的數據進行複雜的統計分析和計算。本文將詳細解釋一個聚合查詢示例,該查詢用於統計滿足特定條件的文檔數量,並計算其占總文檔數量的百分比。這裡回會分享如何統計某個欄位的空值率,然後擴展介紹ES的一些基礎知識。
空值率查詢DSL
此查詢結構通過 GET /my_index/_search
發送到 Elasticsearch,以實現對索引 my_index
的聚合分析。查詢分為以下幾個部分:
{
"size": 0, // 不返回任何搜索結果,只聚合數據
"aggs": {
"all_documents_agg": { // 聚合所有文檔
"terms": {
"script": {
"source": "return 'all_documents';" // 強制所有文檔聚合到一個桶中
}
},
"aggs": {
"total_count": { // 統計所有文檔的數量
"value_count": {
"field": "_id" // 使用文檔的ID欄位進行計數
}
},
"filtered_count": { // 統計滿足特定條件的文檔數量
"value_count": {
"script": {
"source": "if (doc['my_field'].size() != 0 && doc['my_field'].value != '') return 1" // 統計欄位 'my_field' 非空且非零的文檔數量
}
}
},
"percentage_agg": { // 計算滿足特定條件的文檔數量占總文檔數量的百分比
"bucket_script": {
"buckets_path": {
"totalCount": "total_count", // 引用所有文檔的數量
"filteredCount": "filtered_count" // 引用滿足特定條件的文檔數量
},
"script": "params.filteredCount / params.totalCount * 100" // 計算百分比
}
}
}
}
}
}
聚合部分詳解
size: 0
:此設置意味著查詢不會返回具體的搜索結果,而是僅執行聚合分析。aggs(聚合)
:定義了一個名為 all_documents_agg 的聚合。terms
:使用 script 將所有文檔強制聚合到一個名為 all_documents 的桶中。aggs
:在 all_documents 桶內,定義了三個子聚合:total_count
:使用 value_count 統計所有文檔的數量,基於文檔的 _id 欄位。filtered_count
:使用 value_count 統計滿足特定條件的文檔數量。條件是欄位 my_field 非空且非零。percentage_agg
:使用 bucket_script 計算滿足特定條件的文檔數量占總文檔數量的百分比。此聚合使用 total_count 和 filtered_count 的結果,並通過 params.filteredCount / params.totalCount * 100 計算百分比。
Elasticsearch聚合基礎知識擴展
Elasticsearch聚合概念
Elasticsearch 的聚合功能類似於 SQL 中的 GROUP BY 語句,允許我們對數據進行分組和計算統計信息。聚合主要分為以下幾類:
Metric Aggregations
(度量聚合):計算數值,例如計數、平均值、最大值、最小值等。例如,value_count 就是一個度量聚合,用於計算特定欄位的值的數量。Bucket Aggregations
(桶聚合):將文檔分組到不同的桶中。每個桶都可以包含一個或多個文檔。例如,terms 聚合將文檔根據特定欄位的值進行分組。Pipeline Aggregations
(管道聚合):對其它聚合的結果進行進一步計算。例如,bucket_script 可以對多個聚合結果進行自定義計算。
Script 用法
在 Elasticsearch 中,腳本可以用於在查詢和聚合中執行動態計算。在上述查詢中,腳本用於兩個地方:
terms
聚合中的 script:將所有文檔強制聚合到一個桶中。filtered_count
的條件判斷:檢查欄位 my_field 是否非空且非零。bucket_script
聚合:計算滿足條件的文檔數量占總文檔數量的百分比。
使用腳本可以提供更大的靈活性,但需要註意性能和安全性問題。
Elasticsearch聚合查詢語法
Elasticsearch(ES)提供了豐富的聚合功能,用於對數據進行統計和分析。以下是一些常見的聚合類型及其示例:
指標聚合(Metric Aggregations)
sum
:計算數值欄位的總和。avg
:計算數值欄位的平均值。min
:查找數值欄位的最小值。max
:查找數值欄位的最大值。extended_stats
:獲取數值欄位的多個統計數據(平均值、最大值、最小值、總和、方差等)。value_count
:計算欄位的非空值數量。
示例:
{
"aggs": {
"my_sum_agg": {
"sum": {
"field": "numeric_field"
}
},
"my_avg_agg": {
"avg": {
"field": "numeric_field"
}
}
}
}
桶聚合(Bucket Aggregations)
date_histogram
:基於時間範圍將文檔分組為多個桶。histogram
:基於數值欄位將文檔分組為多個桶。terms
:基於字元串或數值欄位將文檔分組為多個桶。filters
:將文檔分組為多個桶,每個桶對應一組過濾條件。
示例:
{
"aggs": {
"my_date_histogram_agg": {
"date_histogram": {
"field": "timestamp",
"interval": "1d"
}
},
"my_terms_agg": {
"terms": {
"field": "category_field"
}
}
}
}
矩陣聚合(Matrix Aggregations)
matrix_stats
:計算多個數值欄位的統計數據(如相關性、協方差、方差等)。
示例:
{
"aggs": {
"my_matrix_stats_agg": {
"matrix_stats": {
"fields": ["numeric_field1", "numeric_field2"]
}
}
}
}
組合聚合(Pipeline Aggregations)
derivative
:計算聚合結果的導數。cumulative_sum
:計算聚合結果的累積和。bucket_script
:在多個桶聚合結果上執行腳本。bucket_selector
:根據腳本選擇或排除特定桶。
示例:
{
"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如何聚合查詢多個統計值,如何嵌套聚合?並相互引用,統計索引中某一個欄位的空值率?語法是怎麼樣的
本文來自博客園,作者:張飛的豬,轉載請註明原文鏈接:https://www.cnblogs.com/the-pig-of-zf/p/18256995
公眾號:張飛的豬大數據分享,不定期分享大數據學習的總結和相關資料,歡迎關註。
個人網站"張飛的豬編程工作室"鏈接: https://zhangfeidezhu.com