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

本文主要是介绍Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • Elasticsearch聚合查询说明
    • 空值率查询DSL
  • Elasticsearch聚合基础知识扩展
    • Elasticsearch聚合概念
    • Script 用法
    • Elasticsearch聚合查询语法
      • 指标聚合(Metric Aggregations)
      • 桶聚合(Bucket Aggregations)
      • 矩阵聚合(Matrix Aggregations)
      • 组合聚合(Pipeline Aggregations)

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

这篇关于Elasticsearch如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076314

相关文章

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

C#实现将Excel工作表拆分为多个窗格

《C#实现将Excel工作表拆分为多个窗格》在日常工作中,我们经常需要处理包含大量数据的Excel文件,本文将深入探讨如何在C#中利用强大的Spire.XLSfor.NET自动化实现Excel工作表的... 目录为什么需要拆分 Excel 窗格借助 Spire.XLS for .NET 实现冻结窗格(Fro

MyBatis-Plus使用动态表名分表查询的实现

《MyBatis-Plus使用动态表名分表查询的实现》本文主要介绍了MyBatis-Plus使用动态表名分表查询,主要是动态修改表名的几种常见场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录1. 引入依赖2. myBATis-plus配置3. TenantContext 类:租户上下文

MySQL基本表查询操作汇总之单表查询+多表操作大全

《MySQL基本表查询操作汇总之单表查询+多表操作大全》本文全面介绍了MySQL单表查询与多表操作的关键技术,包括基本语法、高级查询、表别名使用、多表连接及子查询等,并提供了丰富的实例,感兴趣的朋友跟... 目录一、单表查询整合(一)通用模版展示(二)举例说明(三)注意事项(四)Mapper简单举例简单查询

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE

C# 空值处理运算符??、?. 及其它常用符号

《C#空值处理运算符??、?.及其它常用符号》本文主要介绍了C#空值处理运算符??、?.及其它常用符号,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、核心运算符:直接解决空值问题1.??空合并运算符2.?.空条件运算符二、辅助运算符:扩展空值处理

springboot+mybatis一对多查询+懒加载实例

《springboot+mybatis一对多查询+懒加载实例》文章介绍了如何在SpringBoot和MyBatis中实现一对多查询的懒加载,通过配置MyBatis的`fetchType`属性,可以全局... 目录springboot+myBATis一对多查询+懒加载parent相关代码child 相关代码懒

在DataGrip中操作MySQL完整流程步骤(从登录到数据查询)

《在DataGrip中操作MySQL完整流程步骤(从登录到数据查询)》DataGrip是JetBrains公司出品的一款现代化数据库管理工具,支持多种数据库系统,包括MySQL,:本文主要介绍在D... 目录前言一、登录 mysql 服务器1.1 打开 DataGrip 并添加数据源1.2 配置 MySQL

Go语言中如何进行数据库查询操作

《Go语言中如何进行数据库查询操作》在Go语言中,与数据库交互通常通过使用数据库驱动来实现,Go语言支持多种数据库,如MySQL、PostgreSQL、SQLite等,每种数据库都有其对应的官方或第三... 查询函数QueryRow和Query详细对比特性QueryRowQuery返回值数量1个:*sql