Elasticsearch如何聚合查詢多個(gè)統(tǒng)計(jì)值,如何嵌套聚合?并相互引用,統(tǒng)計(jì)索引中某一個(gè)字段的空值率?語法是怎么樣的

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è)子聚合:
      1. total_count:使用 value_count 統(tǒng)計(jì)所有文檔的數(shù)量,基于文檔的 _id 字段。
      2. filtered_count:使用 value_count 統(tǒng)計(jì)滿足特定條件的文檔數(shù)量。條件是字段 my_field 非空且非零。
      3. 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è)字段的空值率?語法是怎么樣的

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容