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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/733333.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

福州大学 2022~2023 学年第 1 学期考试 A 卷压轴题参考答案

题目: 定义一个抽象类Structure(含有纯虚函数type函数,用以显示当前结构的类型; 含有show函数), 在此基础上派生出Building类, 用来存储一座楼房的层数、房间数以及它的总平方米数。 建立派生 类House&am…

Type-C连接器厂商对检测实验室的要求及重要性解析

Type-C连接器厂商对检测实验室的要求与重要性 Type-C连接器作为一种高速、全功能的接口标准,被广泛应用于各类电子产品中。作为Type-C连接器的制造商,对于产品的质量和性能要求是至关重要的。为了确保产品符合规范并满足市场需求,Type-C连接…

链动2+1模式:解锁用户留存与复购的增长密码

大家好,我是吴军,来自一家业界领先的软件开发公司,专注于为用户打造卓越的产品体验。今天,我想与大家探讨一个在我们产品运营中取得显著成效的策略——链动21模式,以及它是如何助力我们提升用户留存和复购率的。 尽管链…

跟TED演讲学英文:How language shapes the way we think by Lera Boroditsky

How language shapes the way we think Link: https://www.ted.com/talks/lera_boroditsky_how_language_shapes_the_way_we_think? Speaker: Lera Boroditsky Date: November 2017 文章目录 How language shapes the way we thinkIntroductionVocabularySummaryTranscriptA…

6.25世界白癜风日·成都博润白癜风医院获评“成都市医学重点专科”

夏日热情如江潮,勇攀高峰正当时。为激发新质生产力,驱动学术研究引领医院发展,也为了迎接 6.25 世界白癜风日。 6月22日,成都博润白癜风医院隆重举行成都市医学重点专科授牌新闻发布会暨成都市市级继续医学教育项目《难治性白癜风…

PythonScrapy爬虫被ban的一些解决办法

大多数python写爬虫都是当做工具在用,爬虫过程中都会遇到命中反爬导致无法继续访问。访问出现500或者其他服务器禁止错误,像下面这样 在这之前,默认你已经了解python及scrapy。具体selenium的使用方法可以查阅官方文档。 我的处理办法&#x…

Playwright-html-report源码解析

执行命令生成html格式报告 Playwright在执行完成测试,支持生成html格式的测试报告,如下图所示,使用"npx playwright test"执行测试,执行完成后,会提示“npx playwright show-report”命令。执行该命令&#…

Qt Object:智能即时聊天室项目

目录 1.项目介绍 2.设计思路 3.Pro文件配置 4.项目演示 5.项目开源 项目介绍 智能即时聊天室系统(AIChatProject)是一个高效、灵活的即时通讯解决方案。它融合了百度的开源大型语言模型——文心一言,通过API接口实现深度集成。系统专为聊天和…

文件上传漏洞-下篇

一、白名单绕过 目录路径检测绕过 00截断 简介: 0x00是字符串的结束标识符,攻击者可以利用手动添加字符串标识符的方式来将后面的内容进行截断,而后面的内容又可以帮助我们绕过检测。 饶过条件 利用操作:Pass-12 要求&#xff…

关于application/x-www-form-urlencoded跟application/json请求的区别

当你的java方法是这样定义的 PostMapping("/rePushMedicalRecord") public String rePushMedicalRecord(RequestParam("topicId") String topicId){ } 参数是RequestParam接收,则请求时需要用application/x-www-form-urlencoded请求 如果是R…

多重排序【今日题记】

多重排序 多重排序题目分析思路代码代码结构体知识多重排序 需要对多个条件进行排序,因此可以称之为多重排序。 题目 某生物实验室记录了n种(n<=1000)病毒信息,每种病毒都有编号、传染性和致病性三个基本信息,编号是1000-9999的人工编号,其中的传染性和致病性是用0-10…

移动端的HSR技术

overdraw问题&#xff1a; overdraw顾名思义就是过度绘制&#xff0c;就是在渲染过程中**绘制一帧FBO&#xff08;或者RenderTarget&#xff09;**超过一次相同像素的现象!这个是CG的问题&#xff01;特别在是用来大量的透明混合的情况下会产生的&#xff0c;当然客户端andrio…

艾多美用“艾”为生命加油,献血活动回顾

用艾为生命加油 6月10日~16日&#xff0c;艾多美中国开启献血周活动&#xff0c;已经陆续收到来自烟台总部、山东、广东、河南、四川、重庆、贵阳&#xff0c;乌鲁木齐&#xff0c;吉林&#xff0c;等地区的艾多美员工、会员、经销商发来的爱心助力&#xff0c;截止到目前&…

KIVY BLOG Kivy tutorial 007: Introducing kv language

Kivy tutorial 007: Introducing kv language – Kivy Blog DECEMBER 18, 2019 BY ALEXANDER TAYLOR Kivy tutorial 007: Introducing kv language Kivy 导师课007&#xff1a; 介绍kv语言 Central themes: kv language, building a gui, integration with Python 中心主题:…

【React】富文本编辑器react-quill

安装 react-quill 富文本编辑器 npm i react-quill2.0.0-beta.2报错解决&#xff1a; npm i react-quill2.0.0-beta.2 --legacy-peer-deps导入编辑器组件和配套样式文件 import ReactQuill from react-quill // 1 import react-quill/dist/quill.snow.css // 2const Publi…

JR-8000系列机架式多路4K超高清光端机

集中式 4K超高清光传输设备 1 产品特性 ⚫ 支持高达 8 通道 SMPTE 全格式 SDI 信号输入 ⚫ 发送端带有 LOOPOUT 环出端口&#xff0c;具备消抖动功能&#xff0c;可作为信号调理或级联信号源使用 ⚫ 接收端支持双输出端口 ⚫ 支持传输速率&#xff1a;143Mbps-11.88Gbps ⚫…

Redis源码学习:ziplist的数据结构和连锁更新问题

ziplist ziplist 是 Redis 中一种紧凑型的列表结构&#xff0c;专门用来存储元素数量少且每个元素较小的数据。它是一个双端链表&#xff0c; 可以在任意一端进行压入/弹出操作&#xff0c;并且该操作的时间复杂度为O(1)。 ziplist数据结构 <zlbytes><zltail>&l…

CS162 Operating System-lecture2

A tread is suspended or no longer executing when its state’s not loaded in registers the point states is pointed at some other thread .so the thread that’s suspended is actually siting in memory and not yet executing or not executing at all with some thi…

Antd Table 表格 拖拽列宽

antd 的表格组件的列宽&#xff0c;是通过width属性去初始化的&#xff0c;有时候渲染的内容不固定&#xff0c;这个宽做不到通用所以研究怎么实现表格列宽拖动&#xff0c;主要的实现步骤如下&#xff1a; 使用table的components API修改表格头部为 react-resizable提供的组件…

实验13 BGP路径选择

实验13 BGP路径选择 一、 原理描述二、 实验目的三、 实验内容四、 实验配置五、 实验步骤 一、 原理描述 与域内路由不同&#xff0c;域间路由更加注重策略&#xff0c;而不是技术。在域内进行选路&#xff0c;可以使用路由算法计算出到达目的子网的最短路径&#xff1b;而在…