ElasticSearch7.x入门教程之全文搜索聚合分析(十)

news2024/12/26 14:29:51

文章目录

  • 前言
  • 一、指标聚合
    • 1、统计最大值:Max Aggregation
    • 2、统计最小值:Min Aggregation
    • 3、统计平均值:Avg Aggregation
    • 4、求和:Sum Aggregation
    • 5、Cardinality Aggregation
    • 6、基本统计:Stats Aggregation
    • 7、高级统计:Extends Stats Aggregation
    • 8、百分位统计:Percentiles Aggregation
    • 9、按照字段统计:Value Count Aggregation
  • 二、桶聚合(bucket)
    • 1、分组聚合:Terms Aggregation
    • 2、过滤器聚合:Filter Aggregation
    • 3、多过滤器聚合:Filters Aggregation
    • 4、按照范围聚合:Range Aggregation
    • 5、范围聚合:Date Range Aggregation
    • 6、时间直方图聚合:Date Histogram Aggregation
    • 7、空值聚合:Missing Aggregation
    • 8、Children Aggregation
    • 9、地理位置数据统计:Geo Distance Aggregation
    • 10、IP 地址范围查询:IP Range Aggregation
  • 三、 管道聚合
    • 1、计算聚合平均值:Avg Bucket Aggregation
    • 2、Max Bucket Aggregation
    • 3、Min Bucket Aggregation
    • 4、Sum Bucket Aggregation
    • 5、Stats Bucket Aggregation
    • 6、Extended Stats Bucket Aggregation
    • 7、Percentiles Bucket Aggregation
  • 总结


前言

这篇文档就简单记录哈ES中的聚合分析,包括指标聚合桶聚合管道聚合。其实就是数据库中的各类分析函数,比如max()min()avg()group by、having等等。主要应用在一些统计分析业务中。


一、指标聚合

1、统计最大值:Max Aggregation

查询建筑最高的楼层:

GET /building_info/_search
{
  "aggs": {
    "max_floor": {
      "max": {
        "field": "floor"
      }
    }
  }
}

查询结果如下:
在这里插入图片描述
如果字段不存在:

GET /building_info/_search
{
  "aggs": {
    "max_floor": {
      "max": {
        "field": "floor1",
        "missing": 6
      }
    }
  }
}

如果某个文档中缺少 floor1字段,则设置该字段的值为 6。

也可以通过脚本来查询最大值:

GET /building_info/_search
{
  "aggs": {
    "max_floor": {
      "max": {
        "script": {
          "source": "if(doc['floor'].size()!=0){doc.floor.value}"
        }
      }
    }
  }
}

使用脚本时,可以先通过 doc['floor'].size()!=0 去判断文档是否有对应的属性。

2、统计最小值:Min Aggregation

统计最小值,用法和 Max Aggregation 基本一致:

GET /building_info/_search
{
  "aggs": {
    "min_floor": {
      "min": {
        "field": "floor",
        "missing": 6
      }
    }
  }
}

脚本:

GET /building_info/_search
{
  "aggs": {
    "min_floor": {
      "min": {
        "script": {
          "source": "if(doc['floor'].size()!=0){doc.floor.value}"
        }
      }
    }
  }
}

3、统计平均值:Avg Aggregation

统计平均值:

GET /building_info/_search
{
  "aggs": {
    "avg_floor": {
      "avg": {
        "field": "floor"
      }
    }
  }
}

GET /building_info/_search
{
  "aggs": {
    "avg_floor": {
      "avg": {
        "script": {
          "source": "if(doc['floor'].size()!=0){doc.floor.value}"
        }
      }
    }
  }
}

4、求和:Sum Aggregation

求和:

GET /building_info/_search
{
  "aggs": {
    "sum_floor": {
      "sum": {
        "field": "floor"
      }
    }
  }
}

GET /building_info/_search
{
  "aggs": {
    "sum_floor": {
      "sum": {
        "script": {
          "source": "if(doc['floor'].size()!=0){doc.floor.value}"
        }
      }
    }
  }
}

5、Cardinality Aggregation

cardinality aggregation 用于基数统计。类似于 SQL 中的 distinct count(0)。

text 类型是分析型类型,默认是不允许进行聚合操作的,如果相对 text 类型进行聚合操作,需要设置其 fielddata 属性为 true,这种方式虽然可以使 text 类型进行聚合操作,但是无法满足精准聚合,如果需要精准聚合,可以设置字段的子域为 keyword。

  • 1、方式一:
    定义 books 索引:
PUT books
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "publish":{
        "type": "text",
        "analyzer": "ik_max_word",
        "fielddata": true
      },
      "type":{
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "author":{
        "type": "keyword"
      },
      "info":{
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "price":{
        "type": "double"
      }
    }
  }
}

重新插入数据,然后查询出版社的总数量:

GET books/_search
{
  "aggs": {
    "publish_count": {
      "cardinality": {
        "field": "publish"
      }
    }
  }
}

查询结果如下:
在这里插入图片描述
这种聚合方式可能会不准确。可以将 publish 设置为 keyword 类型或者设置子域为 keyword。

  • 2、方式二
PUT books
{
  "mappings": {
    "properties": {
      "name":{
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "publish":{
        "type": "keyword"
      },
      "type":{
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "author":{
        "type": "keyword"
      },
      "info":{
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "price":{
        "type": "double"
      }
    }
  }
}

结果如下:
在这里插入图片描述
对比查询结果可知,使用 fileddata 的方式,查询结果不准确。

6、基本统计:Stats Aggregation

基本统计,一次性返回 count、max、min、avg、sum:

GET books/_search
{
  "aggs": {
    "stats_query": {
      "stats": {
        "field": "price"
      }
    }
  }
}

结果如下:
在这里插入图片描述

7、高级统计:Extends Stats Aggregation

高级统计,比 stats 多出来:平方和、方差、标准差、平均值加减两个标准差的区间:

GET books/_search
{
  "aggs": {
    "es": {
      "extended_stats": {
        "field": "price"
      }
    }
  }
}

8、百分位统计:Percentiles Aggregation

百分位统计:

GET books/_search
{
  "aggs": {
    "p": {
      "percentiles": {
        "field": "price",
        "percents": [
          1,
          5,
          10,
          15,
          25,
          50,
          75,
          95,
          99
        ]
      }
    }
  }
}

9、按照字段统计:Value Count Aggregation

可以按照字段统计文档数量(包含指定字段的文档数量):

GET books/_search
{
  "aggs": {
    "count": {
      "value_count": {
        "field": "price"
      }
    }
  }
}

二、桶聚合(bucket)

1、分组聚合:Terms Aggregation

Terms Aggregation 用于分组聚合,例如,统计各个出版社出版的图书总数量:

GET books/_search
{
  "aggs": {
    "NAME": {
      "terms": {
        "field": "publish",
        "size": 20
      }
    }
  }
}

结果如下:
在这里插入图片描述
在 terms 分桶的基础上,还可以对每个桶进行指标聚合。

统计不同出版社所出版的图书的平均价格:

GET books/_search
{
  "aggs": {
    "NAME": {
      "terms": {
        "field": "publish",
        "size": 20
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

结果如下:
在这里插入图片描述

2、过滤器聚合:Filter Aggregation

过滤器聚合。可以将符合过滤器中条件的文档分到一个桶中,然后可以求其平均值。

例如查询书名中包含 java 的图书的平均价格:

GET books/_search
{
  "aggs": {
    "NAME": {
      "filter": {
        "term": {
          "name": "java"
        }
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

3、多过滤器聚合:Filters Aggregation

多过滤器聚合。过滤条件可以有多个。

例如查询书名中包含 java 或者 office 的图书的平均价格:

GET books/_search
{
  "aggs": {
    "NAME": {
      "filters": {
        "filters": [
          {
            "term":{
              "name":"java"
            }
          },{
            "term":{
              "name":"office"
            }
          }
          ]
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

4、按照范围聚合:Range Aggregation

按照范围聚合,在某一个范围内的文档数统计。

例如统计图书价格在 0-50、50-100、100-150、150以上的图书数量:

GET books/_search
{
  "aggs": {
    "NAME": {
      "range": {
        "field": "price",
        "ranges": [
          {
            "to": 50
          },{
            "from": 50,
            "to": 100
          },{
            "from": 100,
            "to": 150
          },{
            "from": 150
          }
        ]
      }
    }
  }
}

5、范围聚合:Date Range Aggregation

Range Aggregation 也可以用来统计日期,但是也可以使用 Date Range Aggregation,后者的优势在于可以使用日期表达式。

构造数据:

PUT blog/_doc/1
{
  "title":"java",
  "date":"2018-12-30"
}
PUT blog/_doc/2
{
  "title":"java",
  "date":"2020-12-30"
}
PUT blog/_doc/3
{
  "title":"java",
  "date":"2022-10-30"
}

统计一年前到一年后的博客数量:

GET blog/_search
{
  "aggs": {
    "NAME": {
      "date_range": {
        "field": "date",
        "ranges": [
          {
            "from": "now-12M/M",
            "to": "now+1y/y"
          }
        ]
      }
    }
  }
}

说明

1、12M/M 表示 12 个月。
2、1y/y 表示 1年。
3、d 表示天。

6、时间直方图聚合:Date Histogram Aggregation

时间直方图聚合。

例如统计各个月份的博客数量:

GET blog/_search
{
  "aggs": {
    "NAME": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "month"
      }
    }
  }
}

7、空值聚合:Missing Aggregation

空值聚合。

统计所有没有 price 字段的文档:

GET books/_search
{
  "aggs": {
    "NAME": {
      "missing": {
        "field": "price"
      }
    }
  }
}

8、Children Aggregation

可以根据父子文档关系进行分桶。

查询子类型为 student 的文档数量:

GET stu_class/_search
{
  "aggs": {
    "NAME": {
      "children": {
        "type": "student"
      }
    }
  }
}

9、地理位置数据统计:Geo Distance Aggregation

对地理位置数据做统计。

例如查询(34.288991865037524,108.9404296875)坐标方圆 600KM 和 超过 600KM 的城市数量:

GET geo/_search
{
  "aggs": {
    "NAME": {
      "geo_distance": {
        "field": "location",
        "origin": "34.288991865037524,108.9404296875",
        "unit": "km", 
        "ranges": [
          {
            "to": 600
          },{
            "from": 600
          }
        ]
      }
    }
  }
}

10、IP 地址范围查询:IP Range Aggregation

IP 地址范围查询:

GET blog/_search
{
  "aggs": {
    "NAME": {
      "ip_range": {
        "field": "ip",
        "ranges": [
          {
            "from": "127.0.0.5",
            "to": "127.0.0.11"
          }
        ]
      }
    }
  }
}

三、 管道聚合

管道聚合相当于在之前聚合的基础上,再次聚合。

1、计算聚合平均值:Avg Bucket Aggregation

计算聚合平均值。

例如,统计每个出版社所出版图书的平均值,然后再统计所有出版社的平均值:

GET books/_search
{
  "aggs": {
    "book_count": {
      "terms": {
        "field": "publish",
        "size": 3
      },
      "aggs": {
        "book_avg": {
          "avg": {
            "field": "price"
          }
        }
      }
    },
    "avg_book":{
      "avg_bucket": {
        "buckets_path": "book_count>book_avg"
      }
    }
  }
}

2、Max Bucket Aggregation

统计每个出版社所出版图书的平均值,然后再统计平均值中的最大值:

GET books/_search
{
  "aggs": {
    "book_count": {
      "terms": {
        "field": "publish",
        "size": 3
      },
      "aggs": {
        "book_avg": {
          "avg": {
            "field": "price"
          }
        }
      }
    },
    "avg_book":{
      "max_bucket": {
        "buckets_path": "book_count>book_avg"
      }
    }
  }
}

3、Min Bucket Aggregation

统计每个出版社所出版图书的平均值,然后再统计平均值中的最小值:

GET books/_search
{
  "aggs": {
    "book_count": {
      "terms": {
        "field": "publish",
        "size": 3
      },
      "aggs": {
        "book_avg": {
          "avg": {
            "field": "price"
          }
        }
      }
    },
    "avg_book":{
      "min_bucket": {
        "buckets_path": "book_count>book_avg"
      }
    }
  }
}

4、Sum Bucket Aggregation

统计每个出版社所出版图书的平均值,然后再统计平均值之和:

GET books/_search
{
  "aggs": {
    "book_count": {
      "terms": {
        "field": "publish",
        "size": 3
      },
      "aggs": {
        "book_avg": {
          "avg": {
            "field": "price"
          }
        }
      }
    },
    "avg_book":{
      "sum_bucket": {
        "buckets_path": "book_count>book_avg"
      }
    }
  }
}

5、Stats Bucket Aggregation

统计每个出版社所出版图书的平均值,然后再统计平均值的各种数据:

GET books/_search
{
  "aggs": {
    "book_count": {
      "terms": {
        "field": "publish",
        "size": 3
      },
      "aggs": {
        "book_avg": {
          "avg": {
            "field": "price"
          }
        }
      }
    },
    "avg_book":{
      "stats_bucket": {
        "buckets_path": "book_count>book_avg"
      }
    }
  }
}

6、Extended Stats Bucket Aggregation

GET books/_search
{
  "aggs": {
    "book_count": {
      "terms": {
        "field": "publish",
        "size": 3
      },
      "aggs": {
        "book_avg": {
          "avg": {
            "field": "price"
          }
        }
      }
    },
    "avg_book":{
      "extended_stats_bucket": {
        "buckets_path": "book_count>book_avg"
      }
    }
  }
}

7、Percentiles Bucket Aggregation

GET books/_search
{
  "aggs": {
    "book_count": {
      "terms": {
        "field": "publish",
        "size": 3
      },
      "aggs": {
        "book_avg": {
          "avg": {
            "field": "price"
          }
        }
      }
    },
    "avg_book":{
      "percentiles_bucket": {
        "buckets_path": "book_count>book_avg"
      }
    }
  }
}

总结

文章只是简单记录了怎么使用ES的简单统计查询,主要是因为太多或者久了不使用就会忘记一些使用方式,故在此记录。更多详情还是查询官网。

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

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

相关文章

【Linux】DNS服务配置

DNS DNS是什么 DNS是Domain Name System的缩写,即域名系统。它是一种用来将域名转化为IP地址的系统。在互联网中,每个网站都有一个唯一的IP地址,但是人们更习惯使用简单易记的域名来访问网站。DNS的作用就是将这些域名转化为对应的IP地址,使得人们可以通过域名来访问网站…

第31天:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测

时间轴: 演示案例: 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 打包器-WebPack-使用&安全 参考:https://mp.weixin.qq.com/s/J3bpy-SsCnQ1lBov1L98WA Webpack 是一个模块打包器。在 Webpack 中会将前端的所有资源…

开发者如何使用GCC提升开发效率Opencv操作

看此篇前请先阅读 https://blog.csdn.net/qq_20330595/article/details/144134160?spm=1001.2014.3001.5502 https://blog.csdn.net/qq_20330595/article/details/144134160?spm=1001.2014.3001.5502 https://blog.csdn.net/qq_20330595/article/details/144216351?spm=1001…

使用PaddlePaddle实现线性回归模型

目录 ​编辑 引言 PaddlePaddle简介 线性回归模型的构建 1. 准备数据 2. 定义模型 3. 准备数据加载器 4. 定义损失函数和优化器 5. 训练模型 6. 评估模型 7. 预测 结论 引言 线性回归是统计学和机器学习中一个经典的算法,用于预测一个因变量&#xff0…

图像处理网络中的模型水印

论文信息:Jie Zhang、Han Fang、Weiming Zhang、Wenbo Zhou、Hao Cui、Hao Cui、Nenghai Yu:Model Watermarking for Image Processing Networks 本文首次提出了图像处理网络中深度水印问题,将知识产权问题引入图像处理模型 提出了第一个深…

全面UI组件库Telerik 2024 Q4全新发布——官方宣布支持.NET 9

Telerik DevCraft包含一个完整的产品栈来构建您下一个Web、移动和桌面应用程序。它使用HTML和每个.NET平台的UI库,加快开发速度。Telerik DevCraft提供最完整的工具箱,用于构建现代和面向未来的业务应用程序,目前提供UI for ASP.NET MVC、Ken…

计算机毕业设计hadoop+spark民宿推荐系统 民宿数据分析可视化大屏 民宿爬虫 民宿大数据 知识图谱 机器学习 大数据毕业设计

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

工业—使用Flink处理Kafka中的数据_ChangeRecord1

使用 Flink 消费 Kafka 中 ChangeRecord 主题的数据,当某设备 30 秒状态连续为 “ 预警 ” ,输出预警 信息。当前预警信息输出后,最近30

【Android】从事件分发开始:原理解析如何解决滑动冲突

【Android】从事件分发开始:原理解析如何解决滑动冲突 文章目录 【Android】从事件分发开始:原理解析如何解决滑动冲突Activity层级结构浅析Activity的setContentView源码浅析AppCompatActivity的setContentView源码 触控三分显纷争,滑动冲突…

消息中间件-Kafka2-3.9.0源码构建

消息中间件-Kafka2-3.9.0源码构建 1、软件环境 JDK Version 1.8Scala Version 2.12.0Kafka-3.9.0 源码包 下载地址:https://downloads.apache.org/kafka/3.9.0/kafka-3.9.0-src.tgzGradle Version > 8.8Apache Zookeeper 3.7.0 2、源码编译 打开源码根目录修改…

【ElasticSearch】倒排索引与ik分词器

ElasticSearch,简称ES(后文将直接使用这一简称),是一款卓越的开源分布式搜索引擎。其独特之处在于其近乎实时的数据检索能力,为用户提供了迅速、高效的信息查询体验。 它能够解决全文检索,模糊查询、数据分析等问题。那么它的搜索…

【开源免费】基于Vue和SpringBoot的洗衣店订单管理系统(附论文)

博主说明:本文项目编号 T 068 ,文末自助获取源码 \color{red}{T068,文末自助获取源码} T068,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

CAN接口设计

CAN总线的拓扑结构 CAN总线的拓扑结构有点像485总线,都是差分的传输方式,总线上都可以支持多个设备,端接匹配电阻都是120Ω。 485和CAN通信方面最大的区别:网络特性。485是一主多从的通讯方式,CAN是多主通讯,多个设备都可以做主机。那多个设备都相要控制总线呢?…

Keil5配色方案修改为类似VSCode配色

1. 为什么修改Keil5配色方案 视觉习惯:如果你已经习惯了VSCode的配色方案,尤其是在使用ESP-IDF开发ESP32时,Keil5的默认配色可能会让你感到不习惯。减少视觉疲劳:Keil5的默认背景可能过于明亮,长时间使用可能会导致视…

C++设计模式之外观模式

动机 下图中左边方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。 如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统…

矩阵转置        ‌‍‎‏

矩阵转置 C语言代码C 语言代码Java语言代码Python语言代码 💐The Begin💐点点关注,收藏不迷路💐 输入一个n行m列的矩阵A,输出它的转置 A T A^T AT。 输入 第一行包含两个整数n和m,表示矩阵A的行数和列数。…

Linux输入设备应用编程

本章学习输入设备的应用编程,首先要知道什么是输入设备?输入设备其实就是能够产生输入事件的设备就称为输入设备,常见的输入设备包括鼠标、键盘、触摸屏、按钮等等,它们都能够产生输入事件,产生输入数据给计算机系统。…

STM32MX 配置CANFD收发通讯

一、环境 MCU:STM32G0B1CEU6 CAN收发器:JIA1042 二、MX配置 配置SYS 配置canfd并开启中断,我开了两个FDCAN,配置是一样的,这里贴一下波特率的计算公式: 也就是:CAN时钟频率/预分频器/&…

第100+32步 ChatGPT学习:时间序列EMD分解

基于Python 3.9版本演示 一、写在前面 之前我们介绍过时间序列的季节性分解。 最近又学到了好几种骚操作分解,且可以用这些分解优化时间序列预测性能。 首先,我们来学一学经验模态分解(Empirical Mode Decomposition,EMD&#…

Spring Shell如何与SpringBoot集成并快速创建命令行界面 (CLI) 应用程序

Spring Shell 介绍 Spring Shell 是一个强大的工具,可用于构建命令行应用程序,提供了简单的方式来创建和管理交互式 CLI。它适合那些希望通过命令行与 Java 应用程序进行交互的开发者,尤其是在需要自动化、交互式输入或与 Spring 生态系统集…