理解Es的DSL语法(二):聚合

前一篇已经系统介绍过查询语法,详细可直接看上一篇文章(理解DSL语法(一)),本篇主要介绍DSL中的另一部分:聚合

理解Es中的聚合

虽然Elasticsearch 是一个基于 Lucene 的搜索引擎,但也提供了聚合(aggregations)的功能,允许用户对数据进行统计和分析。聚合可以按照不同的维度对数据进行分组和汇总,从而得到有意义的统计信息。这也是Es很多场景下被当作分析工具使用的原因。

聚合语法

使用上来讲,es的聚合就相当于SQL中的group by,在DSL中主要使用aggs关键字和size关键字来控制:

{
  "size":0,
  "aggs":{
    "TestName":{  //自定义的聚合名称
         "term":{ //聚合类型关键字,根据聚合类型来
              "field":"title"  //需要聚合的字段
           }
     }
  }
}

这里着重说一下size关键字,如果单纯进行聚合,而不需要实际数据,最好这里size设置为0,设置size为0在进行聚合时,会默认触发Es的缓存机制,能够很有效的提升性能

当然聚合也可以搭配查询query使用,即对查询的数据进行聚合,例如我们对最近一天的文章,聚合一下标题:

{
  "query":{
     "bool":{
       "filter":[
            {
              "range":{ 
                 "create_time":{
                     "gte":"now - 1d",
                     "lte":"now"
                  }
              }
            }

        ]
    }
  }
  "size":0,
  "aggs":{
    "TestName":{  //自定义的聚合名称
         "term":{ //聚合类型关键字,根据聚合类型来
              "field":"title"  //需要聚合的字段
           }
     }
  }
}

这里Es收到请求后,会先根据query中的条件去检索满足创建时间在近一天内的所有文档,然后对这些文档进行桶聚合,以title字段为桶,将title内容一致的文档放入桶内。

聚合的种类

总的来看,Es的聚合可以分为四类,即Bucketing Aggregations、Metric Aggregations、Matrix Aggregations、Pipeline Aggregations。

Bucketing Aggregations

将数据分桶,类似于 SQL 中的 GROUP BY。例如,可以根据某个字段的不同值将数据分组,然后对每个分组进行统计,对于字段和内容都有一定的限制。

常用的聚合关键字有:

关键字描述适用字段类型
TermsTerms 聚合根据指定字段的确切值将文档分组。它类似于 SQL 中的 GROUP BY 语句。keyword 
Histogram直方图聚合将数值字段划分为指定间隔的桶,并计算每个桶中的文档数量。

数值类型(

integerfloatdouble 、 long)

Date Histogram日期直方图聚合类似于直方图聚合,但它专门用于日期字段,允许你根据时间间隔(如天、周、月等)来分组数据date
Range范围聚合允许你根据指定的范围将数据分组,每个范围定义了上界和下界。数值类型

integerfloatdouble 、 long)

和date
IP Range IP 范围聚合允许你根据 IP 地址的范围将数据分组。ip
Date Range日期范围聚合是范围聚合的日期版本,专门用于日期字段。date
Filter/Filters过滤器聚合根据一个或多个过滤器条件将数据分组,每个过滤器条件定义了一个桶。可以应用于任何类型的字段,但通常与布尔查询结合使用来定义过滤器条件。
Nested 嵌套聚合应用于嵌套字段,它允许你根据嵌套对象中的字段值对嵌套文档进行分组。object或nested

详细的可查阅ElasticSearch的官网,这里仅列出常用的,我们假设Es中存在以下一个数据集合:

[
  {"name": "Book A", "category": "Fiction", "price": 9.99, "publish_date": "2020-01-01"},
  {"name": "Book B", "category": "Science", "price": 15.00, "publish_date": "2021-06-15"},
  {"name": "Book C", "category": "Fiction", "price": 12.50, "publish_date": "2022-03-10"},
  {"name": "Book D", "category": "Education", "price": 8.50, "publish_date": "2019-09-20"},
  {"name": "Book E", "category": "Science", "price": 20.00, "publish_date": "2023-01-05"}
]

并针对该数据集,进行相关的聚合样例:

 Terms Aggregation聚合

查看有多少种category以及每种的文档数量。

示例:

{
   "size":0,
    "aggs": {
        "genres": {
            "terms": {
                "field": "category"  // genre必须为keyword类型
                "size":3         //根据文档数量倒叙展示条数,默认不填写则仅展示10个
            }
        }
    }
}

//输出:
{
  "category": {
    "buckets": [
      {"key": "Fiction", "doc_count": 2},
      {"key": "Science", "doc_count": 2},
      {"key": "Education", "doc_count": 1}
    ]
  }
}
Histogram Aggregation 聚合

按价格区间聚合书籍

{
  "size":0,
  "aggs": {
    "price_distribution": {
      "histogram": {
        "field": "price",
        "interval": 5  //以5元为一个段
      }
    }
  }
}

//输出:
{
  "aggregations": {
    "price_distribution": {
      "buckets": [
        { "key": 5, "doc_count": 1 },
        { "key": 10, "doc_count": 2 },
        { "key": 15, "doc_count": 2 }
      ]
    }
  }
}
Date Histogram Aggregation 聚合

按年份查看出版书籍的数量

{
  "size":0,
  "aggs": {
    "books_over_time": {
      "date_histogram": {
        "field": "publish_date",
        "calendar_interval": "year" //查询区间可以指定单位
      }
    }
  }
}

//输出

{
  "aggregations": {
    "books_over_time": {
      "buckets": [
        { "key_as_string": "2019", "doc_count": 1 },
        { "key_as_string": "2020", "doc_count": 1 },
        { "key_as_string": "2021", "doc_count": 1 },
        { "key_as_string": "2022", "doc_count": 1 },
        { "key_as_string": "2023", "doc_count": 1 }
      ]
    }
  }
}

其中对于date_histogram使用较多,这里单独列一下关于date_histogram的相关参数

  • calendar_interval:按照日历时间间隔(如年、季度、月、周、日等)来创建桶。

  • fixed_interval:按照固定时间间隔(如1小时、5分钟等)来创建桶,不考虑日历界限。

  • min_doc_count:设置为 0 或更大的值,以忽略那些文档计数小于该值的桶。

  • extended_bounds:允许聚合查询返回超出正常查询范围之外的桶,例如在直方图的开始或结束之前添加额外的桶。

  • order:指定桶的排序方式,可以是 asc(升序)或 desc(降序)。

  • format:自定义日期格式,用于指定桶的 key 值的日期格式。

  • time_zone:指定时区来应用到聚合上,特别是对于固定间隔的聚合。

  • pre_zonepost_zone:与 extended_bounds 结合使用,指定额外桶的时区。

{
  "size": 0,
  "aggs": {
    "publish_monthly": {
      "date_histogram": {
        "field": "publish_date",
        "calendar_interval": "month",  // 每月一个桶
        "min_doc_count": 1,            // 只包括至少有一个文档的桶
        "extended_bounds": {
          "min": "2019-01-01",
          "max": "2023-12-31"
        },  // 设置聚合的最小和最大界限
        "order": "desc",              // 桶按降序排序
        "format": "yyyy-MM",          // 桶 key 的格式
        "time_zone": "Europe/Berlin" // 使用柏林时区
      }
    }
  }
}

Range Aggregation聚合

查看价格区间内书籍的数量

{
  "size":0,
  "aggs": {
    "price_ranges": {
      "range": {
        "field": "price",
        "ranges": [
          { "from": 0, "to": 10 },
          { "from": 10, "to": 20 }
        ]
      }
    }
  }
}

//输出
{
  "aggregations": {
    "price_ranges": {
      "buckets": [
        { "from": 0, "to": 10, "doc_count": 2 },
        { "from": 10, "to": 20, "doc_count": 3 }
      ]
    }
  }
}
Filters Aggregation聚合

同时筛选 Fiction 和 Science 类别的书籍,并分别计算数量。

{
  "size":0,
  "aggs": {
    "category_filters": {
      "filters": {
        "filters": {
          "Fiction": {
            "term": {
              "category.keyword": "Fiction"
            }
          },
          "Science": {
            "term": {
              "category.keyword": "Science"
            }
          }
        }
      }
    }
  }
}
//输出
{
  "aggregations": {
    "category_filters": {
      "buckets": {
        "Fiction": { "doc_count": 2 },
        "Science": { "doc_count": 2 }
      }
    }
  }
}

这里特殊说明一下,针对以上场景,也可以使用:

{
 "query": {
  "bool": {
   "filter": [
     {
      "terms": {
      "category": ["Fiction", "Science"]
     }
    }
   ]
  }
 },
 "size": 0,
 "aggs": {
   "category": {
    "terms": {
      "field": "category"
    }
  }
 }
}

不同的是,使用这种聚合,Es的需要进行两次操作,即:先根据query条件,进行数据查询,再对查询结果进行聚合,而Filters聚合则只有一次操作。在相同场景下,考虑性能的话,使用 filters 聚合可能在某些情况下更有效率,因为它可以利用 Elasticsearch 的缓存机制,特别是当这些特定的过滤条件经常被查询时。

Composite Aggregation聚合

按 category 和 publish_date 的每个月份组合聚合书籍。

{
  "size": 0,
  "aggs": {
    "category_date_composite": {
      "composite": {
        "sources": [
          { "category": { "terms": { "field": "category.keyword" } } },
          { "date": { "date_histogram": { "field": "publish_date", "calendar_interval": "month" } } }
        ],
        "size": 10
      }
    }
  }
}
//输出
{
  "composite_of_category_and_date": {
    "buckets": [
      {"key": {"category": "Fiction", "date": "2020-01"}, "doc_count": 1},
      {"key": {"category": "Fiction", "date": "2022-03"}, "doc_count": 1},
      {"key": {"category": "Science", "date": "2021-06"}, "doc_count": 1},
      {"key": {"category": "Science", "date": "2023-01"}, "doc_count": 1}
    ]
  }
}

Metric Aggregations

对数据进行数学运算,如计算平均值、总和、最小值、最大值等。此类大多对数字类型的字段进行聚合。

关键字描述
Sum Aggregation计算数值字段的总和
Avg Aggregation

计算数值字段的平均值

Min Aggregation

找出数值字段中的最小值

Max Aggregation

找出数值字段中的最大值

Stats Aggregation

返回字段的多个统计度量,包括最小值、最大值、平均值和总和。

Cardinality Aggregation

计算字段中唯一值的近似数量,对于大数据集非常有用,因为它比value_count更高效。

一般配合桶查询使用,对标的是SQL中的SUM、MAX等数学函数

Cardinality Aggregation

查看一共有多少文档:

{
  "size":0,
  "aggs": {
    "countALl": {
      "cardinality": {
        "field": "_id"
      }
    }
  }
}

//输出
{
  "aggregations": {
    "countALl": {
      "value": 3
    }
  }
}

Min/Max Aggregation

//查看书籍最贵的价格
{
  "size":0,
  "aggs": {
    "maximum_price": {
      "max": {
        "field": "price"
      }
    }
  }
}
//输出:
{
  "aggregations": {
    "maximum_price": {
      "value": 20.0
    }
  }
}


//查看书籍最便宜的价格
{
  "size":0,
  "aggs": {
    "min_price": {
      "min": {
        "field": "price"
      }
    }
  }
}
//输出
//输出:
{
  "aggregations": {
    "min_price": {
      "value": 5.0
    }
  }
}

Sum/Avg Aggregation

//对库内书籍价格求和
{
  "aggs": {
    "all_price": {
      "sum": {
        "field": "price"
      }
    }
  }
}

//输出:
{
  "aggregations": {
    "all_price": {
      "value": 13.398
    }
  }
}



//对库内书籍价格求均值
{
  "aggs": {
    "average_price": {
      "avg": {
        "field": "price"
      }
    }
  }
}

//输出
{
  "aggregations": {
    "average_price": {
      "value": 13.398
    }
  }
}

Stats Aggregation

查看价格的综合统计

{
  "size":0,
  "aggs": {
    "price_stats": {
      "stats": {
        "field": "price"
      }
    }
  }
}

//输出:
{
  "aggregations": {
    "price_stats": {
      "count": 5,
      "min": 8.5,
      "max": 20.0,
      "avg": 13.398,
      "sum": 66.99
    }
  }
}

聚合嵌套

语法格式为:

{
  "size":0,
  "aggs":{
      "One":{  // 一层桶名称
         "terms":{
            "field":"fielda"
          },
        "aggs":{  //一层桶下二层聚合
            
          } 
       }
   }
}

以书籍书籍为例,查看每类书籍的平均价格,则可以先对书籍类型进行terms聚合,再在terms桶内,获取桶内书籍的平均价格:

//DSL
{
  "size": 0,
  "aggs": {
    "categories": {
      "terms": {
        "field": "keyword"
      },
      "aggs": {
        "average_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

//输出结果
{
  "aggregations": {
    "categories": {
      "buckets": [
        {
          "key": "Fiction",
          "doc_count": 2,
          "average_price": {
            "value": 11.245
          }
        },
        {
          "key": "Science",
          "doc_count": 2,
          "average_price": {
            "value": 17.5
          }
        },
        {
          "key": "Education",
          "doc_count": 1,
          "average_price": {
            "value": 8.5
          }
        }
      ]
    }
  }
}

也可以查看发布年限,每年里发布书籍的总价格:

{
  "size": 0,
  "aggs": {
    "publish_years": {
      "date_histogram": {
        "field": "publish_date",
        "calendar_interval": "year"
      },
      "aggs": {
        "total_price": {
          "sum": {
            "field": "price"
          }
        }
      }
    }
  }
}

//输出
{
  "aggregations": {
    "publish_years": {
      "buckets": [
        {
          "key_as_string": "2019",
          "key": 1577836800000,
          "doc_count": 1,
          "total_price": {
            "value": 8.5
          }
        },
        {
          "key_as_string": "2020",
          "key": 1609459200000,
          "doc_count": 1,
          "total_price": {
            "value": 9.99
          }
        },
        {
          "key_as_string": "2021",
          "key": 1609459200000,
          "doc_count": 1,
          "total_price": {
            "value": 15.0
          }
        },
        {
          "key_as_string": "2022",
          "key": 1640995200000,
          "doc_count": 1,
          "total_price": {
            "value": 12.5
          }
        },
        {
          "key_as_string": "2023",
          "key": 1672531200000,
          "doc_count": 1,
          "total_price": {
            "value": 20.0
          }
        }
      ]
    }
  }
}

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

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

相关文章

判断QT程序是否重复运行

打开exe&#xff0c;再次打开进行提示。 main.cpp添加&#xff1a; #include "QtFilePreview.h" #include <QtWidgets/QApplication> #include <windows.h> #include <qmessagebox.h> #pragma execution_character_set("utf-8")bool Ch…

【LeetCode:2779. 数组的最大美丽值 + 排序 + 二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

荣耀笔记本IP地址查看方法详解:轻松掌握网络配置技巧

在数字化时代的浪潮中&#xff0c;笔记本电脑已经成为我们生活和工作中不可或缺的重要工具。对于荣耀笔记本用户而言&#xff0c;掌握基本的网络配置技巧显得尤为重要。其中&#xff0c;查看IP地址是连接网络、配置设备、排除故障等场景下的关键步骤。本文将详细介绍荣耀笔记本…

adb shell pm path packageName

在Android命令行中&#xff0c;如果你想要查询某个应用程序的安装位置&#xff0c;可以使用pm命令&#xff08;Package Manager的缩写&#xff09;。这个命令提供了很多关于软件包管理的操作&#xff0c;查询应用安装路径&#xff0c;可以使用path选项。 具体命令如下&#xf…

2024全国大学生信息安全竞赛(ciscn)半决赛(华南赛区)Pwn题解

前言 找华南赛区的师傅要了一份半决赛的Pwn题&#xff0c;听说只有一道题。 题目很简单&#xff0c;可以申请任意大小chunk&#xff0c;并存在UAF、DoubleFree漏洞。 还给了后门函数&#xff0c;不过限制是edit只能写8字节的数据到chunk中。 MyHeap 逆向分析 拖入IDA分析…

ETL可视化工具 DataX -- 简介( 一)

引言 DataX 系列文章&#xff1a; ETL可视化工具 DataX – 安装部署 ( 二) 1.1 DataX 1.1.1 Data X概览 DataX 是阿里云DataWorks数据集成的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServ…

【GD32F303红枫派使用手册】第十六节 USART-DMA串口收发实验

16.1 实验内容 通过本实验主要学习以下内容&#xff1a; 串口DMA工作原理 使用DMA进行串口收发 16.2 实验原理 16.2.1 串口DMA工作原理 在前面ADC章节中&#xff0c;我们介绍了DMA的工作原理&#xff0c;这里就不多做介绍。从GD32F303用户手册中可以查到&#xff0c;各串…

四轴飞行器、无人机(STM32、NRF24L01)

一、简介 此电路由STM32为主控芯片&#xff0c;NRF24L01、MPU6050为辅,当接受到信号时&#xff0c;处理对应的指令。 二、实物图 三、部分代码 void FlightPidControl(float dt) { volatile static uint8_t statusWAITING_1; switch(status) { case WAITING_1: //等待解锁 if…

LED显示屏色差处理方法

LED显示屏以其高亮度、低功耗和长寿命等优点&#xff0c;在广告、信息发布和舞台背景等领域得到广泛应用。然而&#xff0c;由于生产批次的不同&#xff0c;LED显示屏在亮度和色度上可能存在差异&#xff0c;影响显示效果。本文将探讨如何通过逐点校正技术来解决这一问题。 逐点…

【C++】和【预训练模型】实现【机器学习】【图像分类】的终极指南

目录 &#x1f497;1. 准备工作和环境配置&#x1f495; &#x1f496;安装OpenCV&#x1f495; &#x1f496;安装Dlib&#x1f495; 下载并编译TensorFlow C API&#x1f495; &#x1f497;2. 下载和配置预训练模型&#x1f495; &#x1f496;2.1 下载预训练的ResNet…

python-基础篇-函数-是什么

文章目录 定义一&#xff1a;如果在开发程序时&#xff0c;需要某块代码多次执行。为了提高编写的效率以及更好的维护代码&#xff0c;需要把具有独立功能的代码块组织为一个小模块&#xff0c;这就是函数。定义一&#xff1a;我们把一些数据喂给函数&#xff0c;让他内部消化&…

七、IP路由原理和路由引入

目录 一、IP路由原理 二、路由引入 2.1、双点双向路由引入 2.2、路由回灌 三、路由策略与路由控制 路由匹配工具&#xff08;规则&#xff09; ACL IP前缀列表 路由控制工具&#xff08;控制&#xff09; 策略工具1 策略工具2 搭配组合 组…

JAVA-CopyOnWrite并发集合

文章目录 JAVA并发集合1_实现原理2_什么是CopyOnWrite?3_CopyOnWriteArrayList的原理4_CopyOnWriteArraySet5_使用场景6_总结 JAVA并发集合 从Java5开始&#xff0c;Java在java.util.concurrent包下提供了大量支持高效并发访问的集合类&#xff0c;它们既能包装良好的访问性能…

【字符函数】

接下来介绍部分字符函数测试 2. 字符转换函数 1.字符分类函数 1.1iscntrl 注&#xff1a;任何控制字符 检查是否有控制字符 符合为真 int main() {int i 0;char str[] "first line \n second line \n";//判断是否遇到控制字符while (!iscntrl(str[i])){p…

springboot网上书店管理系统-计算机毕业设计源码03780

摘 要 网上书店管理系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员和用户两部分&#xff0c;管理员管理主要功能包括&#xff1a;首页、站点管理&#xff08;轮播图&#xff09;用户管理&#xff08;管理员、注册用户&#xff09;内容管理&#x…

51单片机STC89C52RC——代码编译

1&#xff0c;勾选 “Create HEX file” 2&#xff0c;编译

【智源大会2024】(一)智源技术专题

智源的全家桶&#xff1a; 微调数据相关&#xff1a; 1.千万级数据集: BAAI创建了首个千万级别的高质量开源指令微调数据集。 2.模型性能与数据质量: 强调了模型性能与数据质量之间的高度相关性。 3.技术亮点: 使用了高质量的指令数据筛选与合成技术。这些技术显著提升了模型…

效率翻倍!ComfyUI 必装的工作流+模型管理插件 Workspace Manager

一、Workspace Manager 安装方式 插件 Github 网址&#xff1a; https://github.com/11cafe/comfyui-workspace-manager 如果你没有安装 Workspace Manager 插件&#xff0c;可以通过以下 2 种方式安装&#xff1a; ① 通过 ComfyUI Manager 安装&#xff08;推荐&#xff0…

AI办公自动化:kimi批量搜索提取PDF文档中特定文本内容

工作任务&#xff1a;PDF文档中有资料来源这一行&#xff0c;比如&#xff1a; 资料来源&#xff1a;moomoo tech、The Information、Bloomberg、Reuters&#xff0c;浙商证券研究所 数据来源&#xff1a;CSDN、浙商证券研究所 数据来源&#xff1a;CSDN、arXiv、浙商证券研…

OpenGL3.3_C++_Windows(7)

演示 最终演示效果 ​​​​ 冯氏光照 光照原理&#xff1a;对于向量相乘默认为点乘&#xff0c;如果*lightColor(1.0f, 1.0f, 1.0f);白光&#xff0c;值不变物体的颜色显示原理&#xff1a;不被物体吸收的光反射&#xff0c;也就是由白光分解后的一部分&#xff0c;因此&…