elasticsearch aggregation的入门案例
1. 数据的准备
我们的数据结构为:
https://github.com/elastic/elasticsearch/blob/master/docs/src/test/resources/accounts.json
{"index":{"_id":"1"}}
{"account_number":1,"balance":39225,"firstname":"Amber","lastname":"Duke","age":32,"gender":"M","address":"880 Holmes Lane","employer":"Pyrami","email":"amberduke@pyrami.com","city":"Brogan","state":"IL"}
{"index":{"_id":"6"}}
{"account_number":6,"balance":5686,"firstname":"Hattie","lastname":"Bond","age":36,"gender":"M","address":"671 Bristol Street","employer":"Netagy","email":"hattiebond@netagy.com","city":"Dante","state":"TN"}
通过 POST /bank/account/_bulk 批量插入我们的自定义的 bank中。
2. 定义
elasticsearch7.x中为我们提供了这几种查询:
Elasticsearch将聚合分为三类:
度量聚合或计算聚合,诸如总和、最大值、最小或平均值等。
桶聚合,根据字段值,范围或其他条件将文档分组为桶(也称为箱)。
管道聚合从其他聚合(而不是文档或字段)获取输入。
3. 演示
我们用几个案例演示其中的几个API的用法
1)搜索address中包含mill的所有人的年龄分布以及平均年龄
先通过Query DSL查询出address中包含mill的所有数据(如果我们只想要统计的数据,可以用size把数据过滤掉)
然后用aggs聚合。terms将筛选出来的数据按age分组统计;avg则查询数据中的年龄平均值
GET /bank/_search
{"query": {"match": {"address": "mill"}},"aggs": {"ageAgg": {"terms": { "field": "age" } },"avgAge": { "avg": { "field": "age" } }},"size":0
}
最后的结果为:
{"took" : 1,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 4,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"aggregations" : {"ageAgg" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : 38,"doc_count" : 2},{"key" : 28,"doc_count" : 1},{"key" : 32,"doc_count" : 1}]},"avgAge" : {"value" : 34.0}}
}
可以发现,aggregations对象种有我们定义的agAgg对象和avgAge对象,存放着我们想要的值。
2)按照年龄聚合,并查询这些年龄段对应的平均薪资
这次我们是相当于聚合后,在根据聚合的结果进行再次聚合。
GET /bank/_search
{"query": {"match_all": {}},"aggs": {"ageAgg": {"terms": { "field": "age" },"aggs":{"avgBalance":{"avg":{"field":"balance"}}}}},"size":0
}
我们在ageAgg中,嵌套一个aggs,对balance字段进行求平均值。
返回的数据结构如下:
"aggregations" : {"ageAgg" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 463,"buckets" : [{"key" : 31,"doc_count" : 61,"avgBalance" : {"value" : 28312.918032786885}}...
3)查出所有年龄分布,并且这些年龄分段中M的平均薪资和F的平均薪资以及这个年龄段的总体平均薪资
这次我们先按年龄分组,在年龄分组中嵌套gender分组,然后基于gender分组求balance的平均薪资
GET /bank/_search
{"query": {"match_all": {}},"aggs": {"ageAgg": {"terms": { "field": "age" },"aggs":{"genderAgg":{"terms":{"field": "gender.keyword"},"aggs": {"balanceAvg": {"avg": {"field": "balance"}}}}}}},"size":0
}
返回的数据结构如下:
"aggregations" : {"ageAgg" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 463,"buckets" : [{"key" : 31,"doc_count" : 61,"genderAgg" : {"doc_count_error_upper_bound" : 0,"sum_other_doc_count" : 0,"buckets" : [{"key" : "M","doc_count" : 35,"balanceAvg" : {"value" : 29565.628571428573}},{"key" : "F","doc_count" : 26,"balanceAvg" : {"value" : 26626.576923076922}}]}},......
4. 总结
elasticsearch官方为我们提供了很多的聚合类型,我们需要使用是可以查看对应的文档。
https://www.elastic.co/guide/en/elasticsearch/reference/7.11/search-aggregations-metrics-avg-aggregation.html
elasticsearch aggregation的入门案例相关推荐
- Spring Data ElasticSearch入门案例
Spring Data ElasticSearch入门案例 创建maven工程elasticsearch_springdata 基于maven导入坐标 导入spring data elasticsea ...
- 2021年大数据Flink(八):Flink入门案例
目录 Flink入门案例 前置说明 API 编程模型 准备工程 pom文件 log4j.properties Flink初体验 需求 编码步骤 代码实现 Flink入门案例 前置说明 API API ...
- Python:Scrapy的安装和入门案例
Scrapy的安装介绍 Scrapy框架官方网址:http://doc.scrapy.org/en/latest Scrapy中文维护站点:http://scrapy-chs.readthedocs. ...
- Vue安装配置以及入门案例
Vue Vue简介 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不 ...
- AOP配置开发入门案例
该AOP开发入门案例采用XML文件方式配置开发(非注解方式)共包含一个xml文件和4个Java类,创建好web工程后引入相应jar包(文末会给出),建好包(若自定义包名注意更改类中的包名),将xml文 ...
- python与人工智能编程-总算明白python人工智能编程入门案例
Python是非常简洁的一种脚本语言,写同样的程序,代码量仅为java的三分一,除了性能没有Java强之外,它的优点还是相当多的.以下是小编为你整理的python人工智能编程入门案例 下载Active ...
- mybatis基于注解的入门案例
mybatis基于注解的入门案例: 把IUserDao.xml移除,在dao接口的方法上使用@Select注解,并且指定SQL语句 同时需要在SqlMa ...
- python截图保存到内存卡_Python画月饼,云上过中秋,天池Python入门案例系列赛开启...
阿里云天池推出了一个Python入门案例系列教程,在此之前他们还推出了一个Python基础训练营. 在天池龙珠计划Python训练营中,天池给学习者详细的介绍了Python的基础和进阶知识,根据学习者 ...
- Spring-Security 简介、入门案例详解、安全框架、权限验证 SSM项目 使用 JavaConfig配置
Spring-Security 简介 一.介绍 二.详细步骤 1.创建一个maven项目 添加web 框架. 2.导入依赖 3.项目整体结构 4.Spring 容器配置 5.servletContex ...
最新文章
- 队列的定义与操作-顺序存储,链式存储(C语言)
- 前端学习(3131):react-hello-react之总结ref
- asp.net core利用DI实现自定义用户系统,脱离ControllerBase.User
- 问题 L: 求一元二次方程的根
- 树莓派——使用SDK定期备份本地文件到OSS(自用)
- 数学分析教程 第十二章学习感受
- 自然数简化到素数:黎曼猜想RiemannHypothesis及其解释(公号回复“黎曼猜想”下载PDF经典收藏版彩标资料)
- 常见的10种“瓶颈”
- SpringBoot和Vue验证码
- 量子点表面修饰PEG/抗体/金属/细胞膜/无机材料标记与制备
- 小木虫网站无法登陆(账号突然被封禁)的解决办法
- REDIS11_HyperLogLog的概述、基本命令、UV、PV、DAU、MAU、首页UV如何进行统计处理
- 《千万别学英语》精粹
- 更新win10后连接WIFI时,提示“无法连接到这个网络”
- Algorand 系列一:VRF 密码学抽签原理及其在 Algorand 中的应用
- 锂电池采购成本多次上涨,如何利用数字化采购管理系统高效降本?
- c语言字符串做为函数参数传递,c语言:字符串做为函数参数传递
- Threes.js入门篇之2 - Hello World
- 获取浏览器中的cookie
- Android Studio连OPPO手机安装apk失败问题解决方案
热门文章
- java筑基期(9)----ajaxjson(1)
- 操作系统课设--虚拟内存
- 深入解析 Kubebuilder:让编写 CRD 变得更简单
- 数据结构--队列(数组)的一种实现
- 491. 递增子序列(回溯算法)
- 738. 单调递增的数字(贪心算法)
- 关于解决:ModuleNotFoundError: No module named ‘XXX‘的报错问题
- [reference]-armv8汇编学习-书籍推荐
- [register]-TCR(Translation Control Register)寄存器详解
- Linux shell/makefile/gic/python指令速查-inprocess