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 桶内,定义了三个子聚合:total_count
:使用 value_count 统计所有文档的数量,基于文档的 _id 字段。filtered_count
:使用 value_count 统计满足特定条件的文档数量。条件是字段 my_field 非空且非零。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如何聚合查询多个统计值,如何嵌套聚合?并相互引用,统计索引中某一个字段的空值率?语法是怎么样的?的更多相关文章
- MySQL使用select查询时,在查询结果中增加一个字段并指定固定值
假设需求是这样的: mysql> desc user; +-------+----------+------+-----+---------+----------------+ | Field ...
- ElasticSearch实战系列五: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合
Title:ElasticSearch实战系列四: ElasticSearch的聚合查询基础使用教程之度量(Metric)聚合 前言 在上上一篇中介绍了ElasticSearch实战系列三: Elas ...
- Datatable 列查询,统计值
Column 列查询,如下: var dt = CommonUtil.ToDataTable(dataJson); //判断是否有当前日期数据 var systemDateTime = new Com ...
- Elasticsearch系列---聚合查询原理
概要 本篇主要介绍聚合查询的内部原理,正排索引是如何建立的和优化的,fielddata的使用,最后简单介绍了聚合分析时如何选用深度优先和广度优先. 正排索引 聚合查询的内部原理是什么,Elastich ...
- django数据查询之聚合查询和分组查询
<1> aggregate(*args,**kwargs): 通过对QuerySet进行计算,返回一个聚合值的字典.aggregate()中每一个参数都指定一个包含在字典中的返回值.即在查 ...
- django聚合查询
聚合¶ Django 数据库抽象API 描述了使用Django 查询来增删查改单个对象的方法.然而,有时候你需要获取的值需要根据一组对象聚合后才能得到.这份指南描述通过Django 查询来生成和返回聚 ...
- 聚合查询、分组查询、F&Q查询
一.聚合查询和分组查询 1.aggregate(*args, **kwargs): 通过对QuerySet进行计算,返回一个聚合值的字典.aggregate()中每个参数都指定一个包含在字典中的返回值 ...
- 基于对象的跨表查询,多对多查询,多对多操作,聚合查询和分组查询,F查询和Q 查询
基于对象的跨表查询 一对多查询(班级表和学生表) 表结构创建 class Class(models.Model): id = models.AutoField(primary_key=True) cn ...
- ES系列九、ES优化聚合查询之深度优先和广度优先
1.优化聚合查询示例 假设我们现在有一些关于电影的数据集,每条数据里面会有一个数组类型的字段存储表演该电影的所有演员的名字. { "actors" : [ "Fred J ...
- Elasticsearch(5) --- Query查询和Filter查询
Elasticsearch(5) --- Query查询和Filter查询 这篇博客主要分为 :Query查询和Filter查询.有关复合查询.聚合查询也会单独写篇博客. 一.概念 1.概念 一个查询 ...
随机推荐
- LlamaIndex 常见问题解答(FAQ)
提示:如果您尚未完成,请安装 LlamaIndex 并完成起步教程.遇到不熟悉的术语时,请参考高层次概念部分. 在这个章节中,我们将从您为起步示例编写的代码开始,展示您可能希望针对不同应用场景对其进行 ...
- [FAQ] Git 修改最后一次的提交人和提交时间 ?
$ date -R Tue, 21 Mar 2021 21:08:58 +0800 $ git commit --amend --author="xxx <xxx@email.com ...
- 2018-6-30-dotnet-设计规范-·-抽象类
title author date CreateTime categories dotnet 设计规范 · 抽象类 lindexi 2018-6-30 9:2:38 +0800 2018-06-30 ...
- 内网隧道利器Pritunl
一.简介 pritunl是分布式企业内网服务器安全工具,具备web管理界面,有开源版本和收费版本,开源版本功能受限,一般小公司用免费版本就够用了 #官方网站 https://pritunl.com/ ...
- 登录信息localStorage存储
localStorage拓展了cookie的4K限制,与sessionStorage的唯一一点区别就是localStorage属于永久性存储,而sessionStorage属于当会话结束的时候,ses ...
- HTTP 结构概述
Web 客户端和服务器 Web 内容都是存储在 Web 服务器上的,Web 服务器所使用的是 HTTP 协议,因此经常被称为 HTTP 服务器,HTTP 服务器存储了因特网的数据.客户端向服务器发送 ...
- 海康iSC综合安防平台-视频web插件调试
综合安防管理平台 视频WEB插件 1.demo_window_simple_playback.html.demo_window_simple_preview.html为简化版demo,可在此基础上开发 ...
- JavaScript 实现前端文件下载
A.download HTML5的A标签有一个download属性,可以告诉浏览器下载而非预览文件,很实用,参考链接:http://www.zhangxinxu.com/wordpress/2016/ ...
- 同时添加多个的远程桌面工具,Windows远程桌面设置多用户同时登录
Windows Server 版本上的 Windows 远程桌面服务 (RDS) 允许多个用户同时登录. 但是,在标准的Windows桌面版本(例如Windows 10)上,默认情况下,远程桌面是为单 ...
- 构建自定义镜像并优化dockerfile文件
目录 一.系统环境 二.前言 三.镜像构建步骤 四.dockerfile文件常用指令 4.1 dockerfile文件常用指令 4.2 RUN.CMD.ENTRYPOINT的区别 五.构建centos ...