【Elasticsearch】聚合查询(四)

news2024/10/6 16:25:01

Elasticsearch(简称为ES)是一个基于Lucene的开源搜索和分析引擎,提供了丰富的聚合查询功能。聚合查询指的是在搜索结果上执行分组、汇总和统计等操作,以便从大量数据中提取有用的信息和洞察。

这篇文章主要介绍检索相关的操作,单值、多值、范围、模糊等查询方式,使用bool支持多种条件复杂查询。

一、环境准备

版本

Docker version 20.10.22
elasticsearch:7.13.3
kibana:7.13.3
ps:具体启动命令参考第一篇ES博客

二、聚合查询(metrics)

metrics 聚合查询是 Elasticsearch 聚合查询的一种类型,用于计算某个字段的统计指标,如平均值、总和、最大值、最小值、计数等。

常用统计方法

下面是常用的统计值:

  1. avg:计算数值字段的平均值。
  2. sum:对数值字段进行求和。
  3. min:找到数值字段的最小值。
  4. max:找到数值字段的最大值。
  5. stats:计算数值字段的最小值、最大值、平均值和总和。

查询示例

还是以bank索引为例子,"size": 0可以不返回原始数据。

// 查询薪水的平均值
POST /bank/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      }
    }
  },
  // 不需要查询原数据,只返回聚合结果
  "size": 0, 
  "aggs": {
    "avg_balance": {
      "avg": {
        "field": "balance"
      }
    }
  }
}

// 查询各种指标
POST /bank/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      }
    }
  },
  "size": 0,
  "aggs": {
    "stats_balance": {
      "stats": {
        "field": "balance"
      }
    }
  }
}

// 返回值
{
  "took" : 6,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1000,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "stats_balance" : {
      "count" : 1000,// 数量
      "min" : 1011.0,// 最小值
      "max" : 49989.0,// 最大值
      "avg" : 25714.837,// 平均值
      "sum" : 2.5714837E7// 总和
    }
  }
}

三、桶聚合查询(Bucket)

桶聚合查询(Bucket Aggregations)是 Elasticsearch 聚合查询的一种类型,用于按照指定条件将文档分配到不同的"桶"中,并对每个桶进行聚合操作。桶聚合可以根据不同的字段值或范围进行分组和统计,以便提取有关数据集的更详细的信息和洞察。

PS:在桶查询中会有自定义名称,我这里会使用**_self**的后缀来体现。

常用查询类型

以下是一些常见的桶聚合查询类型及其功能:

  1. terms:根据某个字段的值进行分组,创建多个桶,并统计每个桶中的文档数量。
  2. date_histogram:根据时间字段将文档分配到不同的时间段桶中。
  3. range:根据某个字段的值范围将文档分配到不同的桶,并在每个桶上执行其他聚合操作。
  4. histogram:根据数值字段将文档分配到不同的数值段桶中,可以指定桶的间隔大小,并对每个数值段桶进行其他聚合操作。
  5. geo_distance:根据地理位置字段将文档分配到不同的距离范围桶中,可以指定中心点和距离范围,并在每个距离范围桶上执行其他聚合操作。
  6. nested:用于在嵌套的文档结构中进行聚合操作。可以创建多级的嵌套聚合来处理复杂的嵌套数据。

聚合查询

根据年龄进行分组查询。
类似于MySQL中的group by命令,对相同字段进行聚合,等价于select count(*) from bank group by age;

POST /bank/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      }
    }
  },
  "size": 0,
  "aggs": {
    // 自定义查询名称
    "age_group_self": {
      "terms": {
        "field": "age"
      }
    }
  }
}

image.png

聚合统计查询(进阶)

在对年龄分组后,查询组的平均薪水。
等价于select avg(balance) from bank group by age;

POST /bank/_search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      }
    }
  },
  "size": 0,
  "aggs": {
    // 第一次根据年龄聚合
    "age_group_self": {
      "terms": {
        "field": "age"
      },
      // 在每个年龄聚合内容内,取平均数
      "aggs": {
        "avg_balance_group_self": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

image.png

聚合过滤统计查询(再进阶)

更近一步,查询每个年龄段中,薪水大于40000的人员平均工资。
等价于select avg(balance) from bank group by age having balance >= 40000;

POST /bank/_search
{
  "size": 0,
  "aggs": {
    "age_group_self": {
      "terms": {
        "field": "age"
      },
      "aggs": {
        // 相比增加过滤条件
        "avg_balance_group_self": {
          "filter": {
            "range": {
              "balance": {
                "gte": 40000
              }
            }
          },
          // 因为增加了过滤条件,然后把过滤后的结果进行聚合
          "aggs": {
            "avg_balance_group_self": {
              "avg": {
                "field": "balance"
              }
            }
          }
        }
      }
    }
  }
}

image.png

桶选择器

查询人数在55以上的年龄有哪些。
这里使用了bucket_selector 桶选择器,分别有多个参数,介绍如下。

{
    "bucket_selector": {
        "buckets_path": {
            // my_var1 是这个桶的路径中使用脚本中的变量的名称
            // the_sum 路径的度量所使用的变量。
            "my_var1": "the_sum",
            "my_var2": "the_value_count"
        },
        // 在这个聚合上运行的脚本。这个脚本可以是内置的,文件或索引。
        "script": "params.my_var1 > params.my_var2"
    }
}

查询示例

POST /bank/_search
{
  "size": 0,
  "aggs": {
    "age_group_self": {
      "terms": {
        "field": "age"
      },
      "aggs": {
        "age_count_self": {
          "value_count": {
            "field": "age"
          }
        },
        "bucket_filter_self": {
          "bucket_selector": {
            "buckets_path": {
              "count": "age_count_self"
            },
            "script": "params.count > 55"
          }
        }
      }
    }
  }
}

image.png

四、总结

在聚合查询中,aggs 命令下首先是一个自定义命名的查询,在这之下可以继续做 aggs 操作,可以对数据进行过滤、排序等操作,再通过最外部的 query 命令进行检索。
在聚合中,是不会过滤桶的个数的,哪怕桶内已经没有符合要求的数据了,这个时候需要使用桶选择器对桶进行过滤。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

freertos的任务调度器的启动函数分析(根据源码使用)

volatile uint8_t * const pucFirstUserPriorityRegister ( uint8_t * ) ( portNVIC_IP_REGISTERS_OFFSET_16 portFIRST_USER_INTERRUPT_NUMBER ); 通过宏pucFirstUserPriorityRegister0xE000E400(根据宏名字,这是NVIC寄存器地址) 查手册…

26523-2022 精制硫酸钴 随笔练习

声明 本文是学习GB-T 26523-2022 精制硫酸钴. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了精制硫酸钴的要求、试验方法、检验规则、标志、标签、包装、运输和贮存。 本文件适用于精制硫酸钴。 注:该产品主要用于…

【面试题】有了Docker为啥还需要k8s?

个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…

【python】基础语法

文章目录 元组列表字典集合推导式函数错误和异常处理文件和操作系统 元组 元组是一个固定长度,不可改变的Python序列对象。创建元组的最简单方式,是用逗号分隔一列值。 创建 2. 元组不可修改的解释 对于元组对象不可变的说明,通俗一点就是…

自学成为一名黑客

前言:想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安…

【操作系统】调度算法的评价指标和三种调度算法

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 操作系统 一、调度算法的评价指标1.1 CPU利…

使用cpolar端口映射的方法轻松实现在Linux环境下SVN服务器的搭建与公网访问

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

深入剖析ThreadLocal使用场景、实现原理、设计思想

前言 ThreadLocal可以用来存储线程的本地数据,做到线程数据的隔离 ThreadLocal的使用不当可能会导致内存泄漏,排查内存泄漏的问题,不仅需要熟悉JVM、利用好各种分析工具还耗费人工 如果能明白其原理并正确使用,就不会导致各种意…

【Verilog 教程】6.2Verilog任务

关键词:任务 任务与函数的区别 和函数一样,任务(task)可以用来描述共同的代码段,并在模块内任意位置被调用,让代码更加的直观易读。函数一般用于组合逻辑的各种转换和计算,而任务更像一个过程&a…

win10搭建Selenium环境+java+IDEA(2)

接着上一个搭建环境开始叙述:win10系统x64安装java环境以及搭建自动化测试环境_荟K的博客-CSDN博客 上一步结尾的浏览器驱动,本人后面改到了谷歌浏览器.exe文件夹下: 这里需要注意,这个新路径要加载到系统环境变量中。 上一步下…

2023-9-28 JZ26 树的子结构

题目链接:树的子结构 import java.util.*; /** public class TreeNode {int val 0;TreeNode left null;TreeNode right null;public TreeNode(int val) {this.val val;}} */ public class Solution {public boolean HasSubtree(TreeNode root1,TreeNode root2) …

吉利微型纯电,5 万元的快乐

熊猫骑士作为一款主打下层市场的迷你车型,吉利熊猫骑士剑指宝骏悦也,五菱宏光 MINI 等热门选手。 9 月 15 日,吉利熊猫骑士正式上市,售价为 5.39 万,限时优享价 4 .99 万元。价格和配置上对这个级别定位的战略车型有一…

力扣刷题-哈希表-判断两个字符串_其他中元素是否一致

242 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s “anagram”, t “nagaram” 输出: true 示例 2: 输入: s “rat”, t “car” 输出: false 说明: 你可以假设字符串只包含小写字母。 解释&#x…

云安全之身份认证与授权机制介绍

认证与授权技术概述 认证,用于证实某事是否真实或有效的过程。认证一般由标识(ldentification)和鉴别(Authentication)两部分组成。 认证技术分类 身份认证:口令认证、生物特征识别 报文认证:报文源的认证、报文宿的认证、报文内容的认证…

网络爬虫--伪装浏览器

从用户请求的Headers反反爬 在访问某些网站的时候,网站通常会用判断访问是否带有头文件来鉴别该访问是否为爬虫,用来作为反爬取的一种策略。很多网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资…

MQ - 34 基础功能:在消息队列内核中支持WebSocket的设计

文章目录 导图概述WebSocket 是什么双工(双向)通信特点和应用场景客户端使用示例WebSocket 协议和消息队列内核中支持 WebSocket 协议支持功能生产消费协议设计支持 WebSocket Server主动消息推送RabbitMQ / Pulsar 如何支持 WebSocket 协议总结导图

Java基础面试题精选:深入探讨哈希表、链表和接口等

目录 1.ArrayList和LinkedList有什么区别?🔒 2.ArrayList和Vector有什么区别?🔒 3.抽象类和普通类有什么区别?🔒 4.抽象类和接口有什么区别?🔒 5.HashMap和Hashtable有什么区别&…

百数服务商——顶杰云,为建筑行业数字化转型“添砖加瓦”

杭州顶杰科技有限公司: 顶杰科技是国内一家行业领先的软件与信息技术服务提供商同时也是百数在建筑业的垂直领域服务商,通过低代码、云计算、AI大数据、IOT、区块链等先进的产品和技术,致力服务于政府、运营商、央国企、制造、金融、教育、能…

AI项目十:Swin Transformer目标检测环境搭建

若该文为原创文章,转载请注明原文出处。 Swin Transformer是做什么的这里不做介绍,主要是记录下学习的全过程,Swin Transformer在搭建和训练的过程中,折腾了很久,主要是在折腾环境。 一、AutoDL租用实例 个人没有GP…

多线程的学习中篇下

volatile 关键字 volatile 能保证内存可见性 volatile 修饰的变量, 能够保证 “内存可见性” 示例代码: 运行结果: 当输入1(1是非O)的时候,但是t1这个线程并沿有结束循环, 同时可以看到,t2这个线程已经执行完了,而t1线程还在继续循环. 这个情况,就叫做内存可见性问题 ~~ 这…