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


    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 桶内,定义了三个子聚合:
        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:计算字段的非空值数量。

    示例:

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

  • 相关阅读:
    第十九章总结:Java绘图
    NFT 交易市场的格局之变:从一家独大到百家争鸣
    在Spring Boot项目中使用Redisson
    mmdetection从配置到训练
    JavaScript知识系列(4)每天10个小知识点
    【毕业设计】基于超声波与红外的自动调速风扇系统(代码开源) -物联网 嵌入式 stm32
    正则表达式基本概念及常用匹配模式代码
    PMP每日一练 | 考试不迷路-11.23(包含敏捷+多选)
    选择商品属性弹框从底部弹出动画效果
    酒店预订订房小程序源码系统+多酒店入驻 功能齐全 附带完整的搭建教程
  • 原文地址:https://www.cnblogs.com/the-pig-of-zf/p/18256995