您当前所在位置:首页攻略Elasticsearch聚合查询详解

Elasticsearch聚合查询详解

更新:2024-06-19 19:42:25编辑:游戏资讯归类:攻略

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

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

以上就是电脑114游戏给大家带来的关于Elasticsearch聚合查询详解全部内容,更多攻略请关注电脑114游戏。

电脑114游戏-好玩游戏攻略集合版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

口袋翻译官 《绝区零》职场补锅罗曼史任务完成方法