Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的

文章目录

Elasticsearch聚合查询说明

Elasticsearch聚合查询是一种强大的工具,允许我们对索引中的数据进行复杂的统计分析和计算。本文将详细解释一个聚合查询示例,该查询用于统计满足特定条件的文档数量,并计算其占总文档数量的百分比。这里回会分享如何统计某个字段的空值率,然后扩展介绍ES的一些基础知识。

空值率查询DSL

此查询结构通过 GET /my_index/_search 发送到 Elasticsearch,以实现对索引 my_index 的聚合分析。查询分为以下几个部分:

json 复制代码
{
  "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 桶内,定义了三个子聚合:
      1. total_count:使用 value_count 统计所有文档的数量,基于文档的 _id 字段。
      2. filtered_count:使用 value_count 统计满足特定条件的文档数量。条件是字段 my_field 非空且非零。
      3. 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:计算字段的非空值数量。

示例:

json 复制代码
{
  "aggs": {
    "my_sum_agg": {
      "sum": {
        "field": "numeric_field"
      }
    },
    "my_avg_agg": {
      "avg": {
        "field": "numeric_field"
      }
    }
  }
}

桶聚合(Bucket Aggregations)

  • date_histogram:基于时间范围将文档分组为多个桶。
  • histogram:基于数值字段将文档分组为多个桶。
  • terms:基于字符串或数值字段将文档分组为多个桶。
  • filters:将文档分组为多个桶,每个桶对应一组过滤条件。

示例:

json 复制代码
{
  "aggs": {
    "my_date_histogram_agg": {
      "date_histogram": {
        "field": "timestamp",
        "interval": "1d"
      }
    },
    "my_terms_agg": {
      "terms": {
        "field": "category_field"
      }
    }
  }
}

矩阵聚合(Matrix Aggregations)

  • matrix_stats:计算多个数值字段的统计数据(如相关性、协方差、方差等)。

示例:

josn 复制代码
{
  "aggs": {
    "my_matrix_stats_agg": {
      "matrix_stats": {
        "fields": ["numeric_field1", "numeric_field2"]
      }
    }
  }
}

组合聚合(Pipeline Aggregations)

  • derivative:计算聚合结果的导数。
  • cumulative_sum:计算聚合结果的累积和。
  • bucket_script:在多个桶聚合结果上执行脚本。
  • bucket_selector:根据脚本选择或排除特定桶。

示例:

sql 复制代码
{
  "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如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的

相关推荐
java1234_小锋2 小时前
Elasticsearch是如何实现Master选举的?
大数据·elasticsearch·搜索引擎
梦幻通灵8 小时前
ES分词环境实战
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客8 小时前
Elasticsearch 中的热点以及如何使用 AutoOps 解决它们
大数据·运维·elasticsearch·搜索引擎·全文检索
小黑屋说YYDS13 小时前
ElasticSearch7.x入门教程之索引概念和基础操作(三)
elasticsearch
Java 第一深情15 小时前
Linux上安装单机版ElasticSearch6.8.1
linux·elasticsearch·全文检索
KevinAha1 天前
Elasticsearch 6.8 分析器
elasticsearch
wuxingge1 天前
elasticsearch7.10.2集群部署带认证
运维·elasticsearch
Elastic 中国社区官方博客1 天前
Elasticsearch:如何部署文本嵌入模型并将其用于语义搜索
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索
Dreams°1232 天前
【大数据测试 Elasticsearch 的标准--超详细篇】
大数据·elasticsearch·jenkins
鸠摩智首席音效师2 天前
如何在 Elasticsearch 中配置 SSL / TLS ?
elasticsearch·ssl