Elasticsearch8.x聚合查询全面指南:从理论到实战

news2024/11/23 12:06:48

聚合查询的概念

  • 聚合查询(Aggregation Queries)是Elasticsearch中用于数据汇总和分析的查询类型。
  • 它不同于普通的查询,而是用于执行各种聚合操作,如计数、求和、平均值、最小值、最大值、分组等。

聚合查询的分类

分桶聚合(Bucket Aggregations)

  • 类似于SQL中的GROUP BY操作,根据指定的条件对数据进行分组统计。

  • 可以进行嵌套分桶,即在一个分桶的基础上再进行细分。

  • 示例:按照手机的品牌进行分桶统计数量,再在小米手机的分桶基础上按照档次进行二次分桶。

  • 语法格式

GET /index/_search
{
  "size": 0,
  "aggs": {
    "aggregation_name": {
      "bucket_type": {
        "bucket_options": {
          "bucket_option_name": "bucket_option_value",
          ...
        },
        "aggs": {
          "sub_aggregation_name": {
            "sub_aggregation_type": {
              "sub_aggregation_options": {
                "sub_aggregation_option_name": "sub_aggregation_option_value",
                ...
              }
            }
          }
        }
      }
    }
  }
}
#解析
# index: 替换为要执行聚合查询的索引名称。
# aggregation_name: 替换为自定义的聚合名称。
# bucket_type: 替换为特定的桶聚合类型(如 terms、date_histogram、range 等)。
# bucket_option_name 和 bucket_option_value: 替换为特定桶聚合选项的名称和值。# sub_aggregation_name: 替换为子聚合的名称。
# sub_aggregation_type: 替换为特定的子聚合类型(如 sum、avg、max、min 等)。
# sub_aggregation_option_name 和 sub_aggregation_option_value: 替换为特定子聚合选项的名称和值

指标聚合(Metrics Aggregations)

  • 主要用于计算数值字段的统计信息,如平均值、最大值、最小值、求和、去重计数等。

  • 示例:计算某个班级、某个学科的最高分、最低分等。

  • 语法格式

GET /index/_search  
{
  "size": 0,
  "aggs": {
    "aggregation_name": {
      "aggregation_type": {
        "aggregation_field": "field_name"
        // 可选参数
      }
    }
    // 可以添加更多的聚合
  }
}# 解析
#index:要执行聚合查询的索引名称。
#size: 设置为 0 来仅返回聚合结果,而不返回实际的搜索结果,这里将hits改为0表示返回的原始数据变为0
#aggs:指定聚合操作的容器。#aggregation_name:聚合名称,可以自定义。
#aggregation_type:聚合操作的类型,例如 terms、avg、sum 等。
#aggregation_field:聚合操作的目标字段,对哪些字段进行聚合

聚合查询的特点

  • 嵌套性:聚合查询支持嵌套,即一个聚合内部可以包含别的子聚合,实现复杂的数据挖掘和统计需求。

  • 灵活性:可以用于多种场景的数据分析,满足各种业务需求。

  • 高效性:Elasticsearch的聚合查询基于倒排索引和优化的数据结构,使得聚合操作能够高效地执行。

常见聚合用途及应用场景

聚合指标(Aggregation Metrics):

- Avg Aggregation:计算文档字段的平均值。

- Sum Aggregation:计算文档字段的总和。

- Min Aggregation:找到文档字段的最小值。

- Max Aggregation:找到文档字段的最大值。

聚合桶(Aggregation Buckets):

  • Terms Aggregation:基于字段值将文档分组到不同的桶中。
    • 语法格式
GET /index/_search
{
  "size": 0,
  "aggs": {
    "aggregation_name": {
      "bucket_type": {
        "bucket_options": {
          "bucket_option_name": "bucket_option_value",
          ...
        },
        "aggs": {
          "sub_aggregation_name": {
            "sub_aggregation_type": {
              "sub_aggregation_options": {
                "sub_aggregation_option_name": "sub_aggregation_option_value",
                ...
              }
            }
          }
        }
      }
    }
  }
}
#解析
#index: 替换为要执行聚合查询的索引名称。
#aggregation_name: 替换为自定义的聚合名称。
#bucket_type: 替换为特定的桶聚合类型(如 terms、date_histogram、range 等)。
#bucket_option_name 和 bucket_option_value: 替换为特定桶聚合选项的名称和值。#sub_aggregation_name: 替换为子聚合的名称。
#sub_aggregation_type: 替换为特定的子聚合类型(如 sum、avg、max、min 等)。
#sub_aggregation_option_name 和 sub_aggregation_option_value: 替换为特定子聚合选项的名称和值

  • Date Histogram Aggregation:按日期/时间字段创建时间间隔的桶。
    • 语法格式
GET /index/_search
{
  "size": 0,
  "aggs": {
    "date_histogram_name": {
      "date_histogram": {
        "field": "date_field_name",
        "interval": "interval_expression"
      },
      "aggs": {
        "sub_aggregation": {
          "sub_aggregation_type": {}
        }
      }
    }
  }
}#解析
#index:替换为要执行聚合查询的索引名称。
#date_histogram_name:替换为自定义的 date_histogram 聚合名称。
#date_field_name:替换为要聚合的日期类型字段名。
#interval_expression:指定用于分桶的时间间隔。时间间隔可以是一个有效的日期格式(如 1d、1w、1M),也可以是一个数字加上一个时间单位的组合(如 7d 表示 7 天,1h 表示 1 小时)。
#sub_aggregation:指定在每个日期桶内进行的子聚合操作。
#sub_aggregation_type:替换单独子聚合操作的类型,可以是任何有效的子聚合类型。

  • Range Aggregation:根据字段值的范围创建桶。
    • 语法格式
GET /index/_search
{
  "size": 0,
  "aggs": {
    "range_name": {
      "range": {
        "field": "field_name",
        "ranges": [
          { "key": "range_key_1", "from": from_value_1, "to": to_value_1 },
          { "key": "range_key_2", "from": from_value_2, "to": to_value_2 },
          ...
        ]
      },
      "aggs": {
        "sub_aggregation": {
          "sub_aggregation_type": {}
        }
      }
    }
  }
}#解析
# index:替换为要执行聚合查询的索引名称。
# range_name:替换为自定义的 range 聚合名称。
# field_name:替换为要聚合的字段名。
# ranges:指定范围数组,每个范围使用 key、from 和 to 参数进行定义。
# key:范围的唯一标识符。
# from:范围的起始值(包含)。
# to:范围的结束值(不包含)。
# sub_aggregation:指定在每个范围内进行的子聚合操作。
# sub_aggregation_type:替换单独子聚合操作的类型,可以是任何有效的子聚合类型。

Query DSL指标聚合多案例介绍实战

创建索引

PUT /sales
{
  "mappings": {
    "properties": {
      "id":{
        "type":"keyword"
      },
      "product": {
        "type": "keyword"
      },
      "sales": {
        "type": "integer"
      }
    }
  }
}

批量插入数据

POST /sales/_bulk
{"index": {}}
{"product": "iPhone", "sales": 4}
{"index": {}}
{"product": "Samsung", "sales": 60}
{"index": {}}
{"product": "iPhone", "sales": 100}
{"index": {}}
{"product": "Samsung", "sales": 80}
{"index": {}}
{"product": "小米手机", "sales": 50}
{"index": {}}
{"product": "小米手机", "sales": 5000}
{"index": {}}
{"product": "小米手机", "sales": 200}

指标聚合实战

根据商品名称分组
GET /sales/_search
{
  "aggs": {
    "phone_group": {
      "terms": {
        "field": "product"
      }
    }
  }
}

在这里插入图片描述

计算每组的销售总量,使用terms聚合和sum聚合来
GET /sales/_search
{
  "size": 0,
  "aggs": {
    "product_sales": {
      "terms": {
        "field": "product"      
      },
      "aggs": {
        "total_salers": {
          "sum": {
            "field": "sales"
          }
        }
      }
    }
  }
}

在这里插入图片描述

计算总和
GET /sales/_search
{
  "aggs": {
    "sum_sales": {
      "sum": {
        "field": "sales"
      }
    }
  }
}

在这里插入图片描述

计算不同品牌的平均值
GET /sales/_search
{
  "aggs": {
    "product_sales": {
      "terms": {
        "field": "product"
      },
      "aggs": {
        "avg_sales": {
          "avg": {
            "field": "sales"
          }
        }
      }
    }
  }
}

在这里插入图片描述

计算总商品的平均值
GET /sales/_search
{
  "size": 0,
  "aggs": {
    "avg_sales": {
      "avg": {
        "field": "sales"
      }
    }
  }
}

在这里插入图片描述

计算不同品牌的手机的最高低价
GET /sales/_search
{
  "size": 0,
  "aggs": {
    "product_sales": {
      "terms": {
        "field": "product"
      },
      "aggs": {
        "max_sales": {
          "max": {
            "field": "sales"
          }
        }
      }
    }
  }
}
​
​
GET /sales/_search
{
  "size": 0,
  "aggs": {
    "product_sales": {
      "terms": {
        "field": "product"
      },
      "aggs": {
        "max_sales": {
          "min": {
            "field": "sales"
          }
        }
      }
    }
  }
}

在这里插入图片描述

查找最大最小值
GET /sales/_search
{
  "size": 0,
  "aggs": {
    "max_sales": {
      "max": {
        "field": "sales"
      }
    }
  }
}
​
GET /sales/_search
{
  "size": 0,
  "aggs": {
    "max_sales": {
      "min": {
        "field": "sales"
      }
    }
  }
}

在这里插入图片描述

Query DSL 桶聚合Terms案例实战

使用 terms 聚合查询将图书按销售数量进行分桶,并获取每个分桶内的销售数量总和。
GET /book_sales/_search
{
  "size": 0,
  "aggs": {
    "book_buckets": {
      "terms": {
        "field": "book_title"
      },
      "aggs": {
        "total_sales": {
          "sum": {
            "field": "sales_count"
          }
        }
      }
    }
  }
}

在这里插入图片描述

Query DSL 桶聚合Date Histogram介绍和案例实战

使用 date_histogram 聚合查询将订单按日期进行分桶,并计算每个分桶内的订单金额总和
GET /book_sales/_search
{
  "size": 0,
  "aggs": {
    "saler_per_day": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "day",
        "format": "yyyy-MM-dd"
      },
      "aggs": {
        "total_saler": {
          "sum": {
            "field": "sales_count"
          }
        }
      }
    }
  }
}

在这里插入图片描述

Query DSL 桶聚合Range介绍和案例实战

使用 range 聚合查询将商品按价格范围进行分桶,并计算每个分桶内的商品数量

GET /book_sales/_search
{
  "size": 0,
  "aggs": {
    "sales_ranges": {
      "range": {
        "field": "sales_count",
        "ranges": [
          {
            "to": 50
          },
          {
            "from": 50,
            "to": 100
          },
           {
            "from": 100,
            "to": 200
          },
          {
            "from": 200
          }
        ]
      }
    }
  }
}

在这里插入图片描述

通过本篇文章的深入解析,我们不仅掌握了Elasticsearch聚合查询的基本概念与分类,还通过一系列实战案例学习了如何有效地运用分桶聚合与指标聚合进行数据挖掘与统计分析。从简单的平均值、求和计算到复杂的多层级分桶与时间序列分析,Elasticsearch的聚合功能展现了其在大规模数据处理与复杂业务分析场景中的强大能力。
记住,无论是进行市场趋势分析、用户行为洞察还是日志数据的深入挖掘,合理设计聚合查询都是解锁数据价值的关键。随着实践的深入,不断探索高级特性与优化策略,你将能更加灵活高效地应对各种数据分析挑战。
总之,Elasticsearch聚合查询是通往数据智能分析的重要桥梁,它不仅能够帮助我们快速洞察数据分布特征,还能驱动业务决策更加精准高效。希望本指南能成为你掌握Elasticsearch聚合查询技能的坚实基石,开启数据驱动决策的新篇章。
更多精彩内容,请关注以下公众号
在这里插入图片描述

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

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

相关文章

web端使用HTML5开发《贪吃蛇》小游戏教程【附源码】

自制游戏列表 1植物大战僵尸自制HTML5游戏《植物大战僵尸》2开心消消乐自制HTML5游戏《开心消消乐》3贪吃蛇自制HTML5游戏《贪吃蛇》4捕鱼达人自制HTML5游戏《捕鱼达人》 一、游戏简介 贪吃蛇是一款经典的电子游戏,最早在1976年由Gremlin公司推出,…

牛筋面,一口难忘的劲道滋味

在众多的平凉美食中,牛筋面以其独特的口感和丰富的口味,赢得了无数食客的喜爱。牛筋面,这一名字就给人一种坚韧、有嚼劲的印象。它并非由牛筋制成,而是因其面条的口感如牛筋般劲道而得名。牛筋面的制作过程颇具巧思。选用优质的面…

Unity免费领高级可视化编程自定义节点工具AI行为UI流程对话树状态机逻辑等FlowReactor价值50刀high level20240627

刚发现一款类似虚幻蓝图的可视化编程工具,原价50刀,现在免费领取了。赶紧去领取入库,防止作者涨价。 高级可视化编程自定义节点工具:https://prf.hn/l/BJbdvnD 作者其他资产:https://prf.hn/l/YLAYznV Unity免费领高级…

电脑提示msvcr120.dll丢失怎样修复

文件功能与重要性:msvcr120.dll 文件的功能和重要性体现在多个方面,以下是对其核心功能的详细分析: 运行时支持 msvcr120.dll 提供了运行时环境,使得使用 Microsoft Visual C 2013 编译的程序能够调用必要的运行时函数。这些函数…

MySQL高级-索引-使用规则-覆盖索引回表查询

文章目录 1、覆盖索引1.1、查看索引1.2、删除单列索引 idx_user_pro1.3、查询 profession软件工程 and age31 and status01.4、执行计划 profession软件工程 and age31 and status01.5、执行计划 select id,profession,age,status1.6、执行计划 select id,profession,age,statu…

step7:“模拟量界面”逻辑

文章目录 文章介绍效果图AnalogPage.qml结构图调用 SerialPortHandler.sendData(message); serialporthandler.cpp 文章介绍 之前的6步实现了案例MF的界面设计和串口界面的逻辑设计,本文将实现模拟量界面的逻辑设计 新增功能: 1)弹出提示框 …

Mac14.1.2 M1芯片免费读写ntfs硬盘-亲测有效,免费!!!

1. 安装homebrew 打开终端,使用以下命令 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 根据提示逐步完成即可,镜像选择我这里都是保持1的选项。 2. 重启终端 安装完成homebrew后,需…

Java线程池及面试题

1.线程池介绍 顾名思义,线程池就是管理一系列线程的资源池,其提供了一种限制和管理线程资源的方式。每个线程池还维护一些基本统计信息,例如已完成任务的数量。 总结一下使用线程池的好处: 降低资源消耗。通过重复利用已创建的…

第 1 章SwiftUI 简介

在 2019 年的 WWDC 上,Apple 宣布推出一款名为 SwiftUI 的全新框架,令开发者们大吃一惊。该框架不仅改变了开发 iOS 应用的方式,还代表了自 Swift 首次亮相以来 Apple 开发者生态系统最重大的转变。SwiftUI 适用于所有 Apple 平台,包括 iPadOS、macOS、tvOS 和 watchOS,这…

ZSWatch 开源项目介绍

前言 因为时不时逛 GitHub 会发现一些比较不错的开源项目,突发奇想想做一个专题,专门记录开源项目,内容不限于组件、框架以及 DIY 作品,希望能坚持下去,与此同时,也会选取其中的开源项目做专题分析。希望这…

【GD32】08 - IIC(以SHT20为例)

GD32中的IIC 今天来了解一下GD32中的硬件IIC,其实我个人是觉得软件IIC比较方便的,不过之前文章里用的都是软件IIC,今天就算是走出自己的舒适圈,我们来了解了解GD32中的硬件IIC。 我这里用的型号是GD32F407,不同型号的…

多路h265监控录放开发-(14)通过PaintCell自定义日历控件继承QCalendarWidget的XCalendar类

首先创建一个新类XCalendar继承QCalendarWidget类&#xff0c;然后在UI视图设计器中把日历提升为XCalendar&#xff0c;通过这个函数自己设置日历的样式 xcalendar.h #pragma once #include <QCalendarWidget> class XCalendar :public QCalendarWidget { public:XCal…

Java基础(四)——字符串、StringBuffer、StringBuilder、StringJoiner

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

C++编程(四)this指针 常函数 常对象 静态成员

文章目录 一、this指针&#xff08;一&#xff09;概念&#xff08;二&#xff09;显式使用this指针的场景1. 当形参和成员变量名一致时2. 返回对象自身的时候必须要使用this指针3. 在类中销毁一个对象 二、常函数和常对象&#xff08;一&#xff09;常函数1. 概念2. 语法格式 …

Linux Static calls机制

文章目录 前言一、简介二、Background: indirect calls, Spectre, and retpolines2.1 Indirect calls2.2 Spectre (v2)2.3 RetpolinesConsequences 2.4 Static callsHow it works 三、其他参考资料 前言 Linux内核5.10内核版本引入新特性&#xff1a;Static calls。 Static c…

关于摄像头模组中滤光片的介绍

1、问题背景 红外截止滤光片&#xff08;IR CUT Filter&#xff09;是应用在摄像头模组中非常重要的一个器件&#xff0c;因人眼与 coms sensor 对光线各波长的响应不同&#xff0c; 人眼看不到红外光&#xff0c;但 sensor 能感应到&#xff08;如下图是某sensor在各波长下的…

【设计模式-04】原型模式

【设计模式-04】原型模式 1. 概述2. 结构3. 实现4. 案例5. 使用场景6. 优缺点6.1 原型模式的优点6.2 原型模式的缺点 7. 实现深克隆(深拷贝) 1. 概述 原型模式: 用一个已经创建的实例作为原型&#xff0c;通过复制该原型对象来创建一个和原型对象相同的新对象。 2. 结构 原型…

策略模式和状态模式

策略模式 在上下文中携带策略接口作为成员变量&#xff0c;在使用上下文之前需要设置策略setStrategy&#xff08;&#xff09;&#xff0c;然后使用策略接口成员变量来进行策略的执行。 步骤1&#xff1a;定义策略接口 // 策略接口 public interface Strategy {int execut…

面试突击:ArrayList源码详解

本文已收录于&#xff1a;https://github.com/danmuking/all-in-one&#xff08;持续更新&#xff09; 前言 哈喽&#xff0c;大家好&#xff0c;我是 DanMu。ArrayList 是我们日常开发中不可避免要使用到的一个类&#xff0c;并且在面试过程中也是一个非常高频的知识点&#…

酷睿Ultra 200V系CPU全阵容规格、跑分出炉:拉了坨大的

从最近几个月 12 代酷睿 CPU 大面积降价清库存&#xff0c;到 13、14 代高端 U 大范围翻车问题迟迟得不到解决。 这就很难不让人生出一种 Intel 似乎真无暇顾及老款 U&#xff0c;而是将有限精力通通放在了接下来酷睿 Ultra 处理器上的感觉。 当然&#xff0c;作为新工艺、新架…