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 Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

hdu1254(嵌套bfs,两次bfs)

/*第一次做这种题感觉很有压力,思路还是有点混乱,总是wa,改了好多次才ac的思路:把箱子的移动当做第一层bfs,队列节点要用到当前箱子坐标(x,y),走的次数step,当前人的weizhi(man_x,man_y),要判断人能否将箱子推到某点时要嵌套第二层bfs(人的移动);代码如下:

hdu1496(用hash思想统计数目)

作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。 解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2, 各自作为数组的下标,如果两部分相加为0,则满足等式; 代码如下: #include<iostream>#include<algorithm

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

hdu4267区间统计

题意:给一些数,有两种操作,一种是在[a,b] 区间内,对(i - a)% k == 0 的加value,另一种操作是询问某个位置的值。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import

hdu4417区间统计

给你一个数列{An},然后有m次查询,每次查询一段区间 [l,r] <= h 的值的个数。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamRead

hdu3333区间统计

题目大意:求一个区间内不重复数字的和,例如1 1 1 3,区间[1,4]的和为4。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |