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

聚合查询的概念

  • 聚合查询(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聚合查询技能的坚实基石,开启数据驱动决策的新篇章。
更多精彩内容,请关注以下公众号
在这里插入图片描述

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

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

相关文章

绘唐3是免费的吗?

绘唐科技是一家中国电子信息产品制造商和供应商,成立于2005年。公司主要经营智能硬件、智能穿戴设备、智能家居设备和智能交通设备等领域的产品开发和销售。绘唐科技拥有强大的研发团队和制造能力,能够为客户提供定制化的产品解决方案。 绘唐科技的产品种…

【Spring】Spring学习笔记

Spring数据库 Spring JDBC 环境准备 创建Spring项目, 添加以下依赖 H2 Database: 用于充当嵌入式测试数据库JDBC API: 用于连接数据库Lombok: 用于简化pojo的编写 然后添加配置文件: spring.output.ansi.enabledALWAYS spring.datasource.username*********** spring.dataso…

3d怎么把歪的模型摆正?---模大狮模型网

在进行3D建模过程中,有时候会遇到模型出现歪曲或者旋转不正确的情况,这可能会影响到后续的设计和渲染效果。因此,学会将歪曲的模型摆正是一个非常重要的技巧。模大狮将介绍几种常用的方法,帮助您有效地将歪曲的3D模型摆正&#xf…

抖音团购达人实战营,抖音团购达人从0-1教程(11节课)

课程目录: 1-团购达人先导课1.mp4 2-账号措建.mp4 2-账号搭建_1.mp4 3-开通团购达人_1.mp4 4-账号养号涨粉套路_1.mp4 5-团购选品正确姿势_1.mp4 6-短视频之混剪课_1.mp4 7-短视频之图文课_1.mp4 8-短视频之口播课_1.mp4 9-短视频运营策略_1.mp4 10-团购…

纯血鸿蒙Beta版本发布,中国华为,站起来了!

2024年6月21日至23日,华为开发者大会2024(HDC 2024)于东莞盛大举行。 此次大会不仅在会场设置了包括鸿蒙原生应用、统一生态统一互联等在内的11个展区,以供展示HarmonyOS NEXT的强大实力,还对外宣布了HarmonyOS的最新进…

初探 YOLOv8(训练参数解析)

文章目录 1、前言2、Backbone网络3、YOLOv8模型训练代码3.1、模型大小选择3.2、训练参数设置 4、训练参数说明5、目标检测系列文章 1、前言 YOLO 因为性能强大、消耗算力较少,一直以来都是实时目标检测领域的主要范式。该框架被广泛用于各种实际应用,包…

Linux网络编程:套接字编程

1.Socket套接字编程 1.1.什么是socket套接字编程 Socket套接字编程 是一种基于网络层和传输层网络通信方式,它允许不同主机上的应用程序之间进行双向的数据通信。Socket是网络通信的基本构件,它提供了不同主机间的进程间通信端点的抽象。一个Socket就是…

World of Warcraft [CLASSIC] Level 70 Dire Maul (DM)

[月牙钥匙] [大型爆盐炸弹] World of Warcraft [CLASSIC] Level 70 厄运之槌,完美贡品,Dire Maul (DM) Foror‘s Compendium of Dragon Slaying 佛洛尔的屠龙技术纲要 因为不是兽王宝宝,而且开始位置放的不对&am…

Arathi Basin (AB) PVP15

Arathi Basin (AB) PVP15 阿拉希盆地,PVP,15人战场

C# 23设计模式备忘

创建型模式:单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。 原型(Prototype)模式:将一个对象作为原型&…

机器人控制系列教程之URDF自动生成工具

URDF文件的编写较为复杂,ROS官方提供了URDF的SolidWorks插件,可方便地将 SW 零件和装配体导出为 URDF 文件。导出器将创建一个类似 ROS 的软件包,其中包含网格、纹理和机器人(URDF 文件)目录。对于单一的 SolidWorks 零…

CVE-2024-37032漏洞预警:尽快升级Ollama

实时了解业内动态,论文是最好的桥梁,专栏精选论文重点解读热点论文,围绕着行业实践和工程量产。若在某个环节出现卡点,可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技(Mamba,xLSTM,KAN)…

Mac电脑安装HomeBrew工具(100%成功)

1.Homebrew是什么? homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等功能。通过简单的指令可以实现包管理,而不用关心各种依赖和文件路径情况。 2.homebrew常用命令 检测是否安装HomeBrew: brew -v卸载Hom…

AI提示词投喂新手教程(一):基础概念和工具

对于很多已经熟悉提示词工程(prompt engineering)的朋友来说,以下内容可能已经是老生常谈了。然而,仔细搜索和翻阅了星球上关于提示词的新手教程,发现对新手并不是很友好,内容零散且缺乏系统性。为此&#…

面试突击:Java 集合知识体系梳理

本文已收录于:https://github.com/danmuking/all-in-one(持续更新) 前言 哈喽,大家好,我是 DanMu。在 Java 开发中,集合类对象绝对是被使用最频繁的对象之一。因此,深入了解集合类对象的底层数…

面试突击:ArrayList源码详解

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

NSIS 打包发布 exe 安装包之 配置文件参数说明

一、打包exe教程 详见上期博客:visual studio打包QT工程发布exe安装包 二、参数说明 1、程序图标显示无效问题 在nsi配置文件中找到以下行,分别在尾部追加 “” “$INSTDIR\logo-ico.ico” , logo-ico.ico为程序图标名称,Setup…

62.指针和二维数组(2)

一.指针和二维数组 1.如a是一个二维数组,则数组中的第i行可以看作是一个一维数组,这个一维数组的数组名是a[i]。 2.a[i]代表二维数组中第i行的首个元素的地址,即a[i][0]的地址。 二.进一步思考 二维数组可以看作是数组的数组,本…

电子电器及家电制造行业MES系统解决方案介绍

电子电器及家电制造行业是一个技术高度密集、生产工艺复杂且市场需求变化迅速的行业。为了提升生产效率、保证产品质量并快速响应市场变化,越来越多的电子电器及家电制造企业引入了MES系统。本文将详细介绍MES系统在电子电器及家电制造行业的应用方法及其价值。 一…

【公开数据集获取】

Open Images Dataset https://www.youtube.com/watch?vdLSFX6Jq-F0