ES 除了DSL查询aggregations也是很重要的,如果说DSL相当于sql aggregations就相当于group by 和一些sum count 函数

aggregations能作什么

aggregations主要分三个部分,分桶聚合,指标聚合,管道聚合,aggregations在写查询语句的时候可以简写成aggs

 分桶聚合(bucket):相当于sql的group by 能按照某一个或多个条件,对数据进行分桶(分组),默认返回数据的count(计数)条数,但实际上,可以理解为数据被分桶了,方便后面的聚合或者统计操作,后面会有实际的例子。

指标聚合(metrice):就是对分桶,或者未分桶的数据进行计算,例如avg求平均值,MAX最大值,min最小值,value count 计数 cardinality 基数 去重 starts 统计聚合等

管道聚合(pipeline):基于聚合结果的查询,分桶有可能是多层的,也有可能和指标是仙桃的,管道聚合可以根据路径(分桶和指标聚合时候的命名路径)对数据进行有针对性的操作,例如排序。

aggregations如何使用

es先插入数据

PUT /product/_doc/1
{"name" : "小米手机","desc" :  "手机中的战斗机","price" :  3999,"lv":"旗舰机","type":"手机","createtime":"2020-10-01T08:00:00Z","tags": [ "性价比", "发烧", "不卡顿" ]
}
PUT /product/_doc/2
{"name" : "小米NFC手机","desc" :  "支持全功能NFC,手机中的滑翔机","price" :  4999,"lv":"旗舰机","type":"手机","createtime":"2020-05-21T08:00:00Z","tags": [ "性价比", "发烧", "公交卡" ]
}
PUT /product/_doc/3
{"name" : "NFC手机","desc" :  "手机中的轰炸机","price" :  2999,"lv":"高端机","type":"手机","createtime":"2020-06-20","tags": [ "性价比", "快充", "门禁卡" ]
}
PUT /product/_doc/4
{"name" : "小米耳机","desc" :  "耳机中的黄焖鸡","price" :  999,"lv":"百元机","type":"耳机","createtime":"2020-06-23","tags": [ "降噪", "防水", "蓝牙" ]
}
PUT /product/_doc/5
{"name" : "红米耳机","desc" :  "耳机中的肯德基","price" :  399,"type":"耳机","lv":"百元机","createtime":"2020-07-20","tags": [ "防火", "低音炮", "听声辨位" ]
}
PUT /product/_doc/6
{"name" : "小米手机12","desc" :  "充电贼快掉电更快,超级无敌望远镜,高刷电竞屏","price" :  5999,"lv":"旗舰机","type":"手机","createtime":"2020-07-27","tags": [ "120HZ刷新率", "120W快充", "120倍变焦" ]
}
PUT /product/_doc/7
{"name" : "挨炮 SE2","desc" :  "除了CPU,一无是处","price" :  3299,"lv":"旗舰机","type":"手机","createtime":"2020-07-21","tags": [ "割韭菜", "割韭菜", "割新韭菜" ]
}
PUT /product/_doc/8
{"name" : "XS Max","desc" :  "听说要出新款15手机了,终于可以换掉手中的4S了","price" :  4399,"lv":"旗舰机","type":"手机","createtime":"2020-08-19","tags": [ "5V1A", "4G全网通", "大" ]
}
PUT /product/_doc/9
{"name" : "小米电视","desc" :  "70寸性价比只选,不要一万八,要不要八千八,只要两千九百九十八","price" :  2998,"lv":"高端机","type":"电视","createtime":"2020-08-16","tags": [ "巨馍", "家庭影院", "游戏" ]
}
PUT /product/_doc/10
{"name" : "红米电视","desc" :  "我比上边那个更划算,我也2998,我也70寸,但是我更好看","price" :  2999,"type":"电视","lv":"高端机","createtime":"2020-08-28","tags": [ "大片", "蓝光8K", "超薄" ]
}
PUT /product/_doc/11
{"name": "红米电视","desc": "我比上边那个更划算,我也2998,我也70寸,但是我更好看","price": "2998","type": "电视","lv": "高端机","createtime": "2020-08-28","tags": ["大片","蓝光8K","超薄"]
}

分桶聚合简单例子

 GET product/_search{"size": 0, "aggs": {"tagtest": {//操作的命名"terms": {//分桶方式"field": "tags.keyword",//按tags 进行分桶 keyword 代表不分词 直接取数据"size": 10}}}}

指标聚合简单例子

 GET product/_search{"size": 0,"aggs": {"max": {"max": {"field": "price"}},"min": {"min": {"field": "price"}},"avg": {"avg": {"field": "price"}}}}GET product/_search{"size": 0,"aggs": {"price_stats": {"stats": {"field": "price"}}}
}

管道聚合例子

取按type分组后,进行avg平均值计算后,所有数据的最小值

嵌套聚合

根据 商品的 type,和lv(级别)进行分桶(嵌套),利用avg函数对价格计算平均值,利用管道查出分桶平均后的最小值

     GET product/_search{"size": 0,"aggs": {"type_lv": {"terms": {"field": "type.keyword"},"aggs": {"lv": {"terms": {"field": "lv.keyword"},"aggs": {"price_avg": {"avg": {"field": "price"}}}},"price_min": {"min_bucket": {"buckets_path": "lv>price_avg"}}}}}}

基于查询结果的聚合

1 可以再aggs同级下添加 查询或筛选条件,对分桶的数据进行条件限制

例如添加条件筛选,按标签分桶,限制价格区间

     GET product/_search{"query": {"range": {"price": {"gte": 2000,"lte": 6000} }}, "aggs": {"type_lv": {"terms": {"field": "type.keyword"}}}}

用过滤器对进行过滤然后分桶

     GET product/_search{"query": {"bool": {"filter": [{"range": {"price": {"gte": 10,"lte": 2000}}}]}},"aggs": {"type_lv": {"terms": {"field": "type.keyword"}}}
}

基于聚合结果的查询(分桶后对分桶后的数据进行筛选查询)

对分桶的部分结果,取消查询或筛选条件的限制

Global 阻断 上面的查询条件

如果多维度统计 有些需要过滤之后统计,有些不需要

     GET product/_search{"size": 0,"query": {"range": {"price": {"gte": 1000}}}, "aggs": {"max": {"max": {"field": "price"}},"min": {"min": {"field": "price"}},"avg": {"global": {}, "aggs": {"price_avg": {"avg": {"field": "price"}}}}}}

不同的指标聚合 有的根据筛选聚合 有的全量数据聚合

     GET product/_search{"size": 0,"aggs": {"max": {"max": {"field": "price"}},"min": {"min": {"field": "price"}},"avg": {"filter": {"range": {"price": {"gte": 1000}}},"aggs": {"price_avg": {"avg": {"field": "price"}}}}}
}

基于聚合的排序

按照count排序

     GET product/_search{"size": 0,"aggs": {"tag_bucket":{"terms": {"field": "tags.keyword","size": 10,"order": {"_count": "asc"}}}}
}

多级排序

     GET product/_search{"size": 0,"aggs": {"type_first_order":{"terms": {"field": "type.keyword","order": {"_term": "asc"}},"aggs": {"lv_second_order": {"terms": {"field": "lv.keyword","order": {"_key": "asc"}}}}}}
}

多级聚合

     GET product/_search{"size": 0,"aggs": {"type_stats_price": {"terms": {"field": "type.keyword","order": {"aggs_price>stats.sum": "asc"}},"aggs": {"aggs_price": {"filter": {"terms": {"type.keyword": ["耳机","手机","电视"]}},"aggs": {"stats": {"stats": {"field": "price"}}}}}}}}

ES-aggregations相关推荐

  1. 四:es聚和函数Aggregations

    1.格式 "aggregations" : {"<aggregation_name>" : {"<aggregation_type& ...

  2. 【Elasticsearch】15 ES文档的基本操作 aggregations 【执行聚合操作】

    一.描述 1. 搜素address 中包含mill 的所有人的年龄分布以及平均年龄,但不显示这些人的详情 按年龄聚合 GET bank/_search {"query": {&qu ...

  3. es父子结构查询_ES 父子文档查询

    父子文档的特点 1. 父/子文档是完全独立的. 2. 父文档更新不会影响子文档. 3. 子文档更新不会影响父文档或者其它子文档. 父子文档的映射与索引 1. 父子关系 type 的建立必须在索引新建或 ...

  4. java操作es聚合操作并显示其他字段_java使用elasticsearch分组进行聚合查询过程解析...

    这篇文章主要介绍了java使用elasticsearch分组进行聚合查询过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java连接elas ...

  5. es的聚合mysql聚合速度_Elasticsearch(8) --- 聚合查询(Metric聚合)

    摘要: quot;:0,"aggs":{"stats_salary":{"stats":{"field":"s ...

  6. ES学习笔记之-AvgAggregation的实现过程分析

    我们需要查看数据的统计量时,均值是最重要的特征之一. 对于海量数据,这类简单的聚合ES可以做到秒级别返回.聚合是ES的特色功能. 那么ES是如何实现这一功能的呢? 我们知道,ES的数据存储在各个节点中 ...

  7. es统计有多少个分组_es多字段分组去重统计

    < es多字段分组去重统计 oracle中sql: select a1 ,b1 from dual group by a1 ,b1 或 select DISTINCT a1 ,b1 from d ...

  8. ES cross cluster search跨集群查询

    ES 5.3以后出的新功能.测试demo如下: 下载ES 5.5版本,然后分别本机创建2个实例,配置如下: cluster.name: xx1 network.host: 127.0.0.1 http ...

  9. python连接es数据库_Python Elasticsearch API操作ES集群

    环境Centos 7.4 Python 2.7 Pip 2.7 MySQL-python 1.2.5 Elasticsearc 6.3.1 Elasitcsearch6.3.2 知识点调用Python ...

  10. java操作es聚合操作并显示其他字段_java使用elasticsearch分组进行聚合查询(group by)-项目中实际应用...

    java连接elasticsearch 进行聚合查询进行相应操作 一:对单个字段进行分组求和 1.表结构图片: 根据任务id分组,分别统计出每个任务id下有多少个文字标题 1.SQL:select i ...

最新文章

  1. 19岁「黑客」连续破解25辆特斯拉:远程控制门窗、灯光、音乐,还能直接开走...
  2. 20181127-1附加作业 软件工程原则的应用实例
  3. Zabbix监控Windows客户端设置
  4. 顶象深度画像亮相GMIC,用AI提升金融反欺诈
  5. C++ Primer 5th笔记(chap 17 标准库特殊设施)控制输入格式
  6. #研发解决方案介绍#Tracing(鹰眼)
  7. 8个Python小游戏,可以上班摸鱼玩一天
  8. 在小程序中如何使用svg图标
  9. 训练集和验证集的划分
  10. 什么叫股指期货,股指期货交易流程是什么
  11. 2.自动加载(phalapi框架总结)
  12. shiro实现无状态的会话,带源码分析
  13. 面试:你的离职原因该怎么回答
  14. garch dcc用matlab,用matlab工具箱怎么对garch模型做...
  15. STM32CubeMX系列09——SDIO(SD卡读写、SD卡移植FATFS文件系统)
  16. Dojo 1.6 最新官方教程: Dojo DOM 函数
  17. $U_{GSQ}$对共源放大电路电压放大倍数的影响
  18. 强制删除桌面多余或恶意IE图标方法 :强制删除桌面多余或恶意IE图标方法:
  19. linux 9 aml 设置wifi,aml常用命令.pdf
  20. greenplum常用的gp_toolkit监控语句

热门文章

  1. web 原型设计工具_适用于Web设计人员的7种原型设计工具
  2. 基于Java+SpringBoot+vue+element实现毕业就业招聘系统
  3. 推荐一些硬核的公众号
  4. 现在 MKV、MP4 等格式的压缩与效果都更好,为什么 RMVB 还是那么流行?
  5. 正确设置 php-fpm子进程用户 提高网站安全性 防止被挂木马
  6. P2P三种模式的分化和实质
  7. js 针对异步的处理
  8. 微信小程序轮播中间大两边小
  9. 如何与人进行有效沟通
  10. HTTP请求头部+响应码