一、介绍 (偏自我理解)
1.ES聚合查询通用流程
1.分组 ( 好比Mysql ---> group by )
2.组内聚合 也叫 组内指标( 好比Mysql ---> SUM()、COUNT()、AVG()、MAX()、MIN() )
2.桶(我要是es开发者,我起名叫啥都行)
1.满足特定条件的文档的集合,叫做桶。
桶的就是一组数据的集合,对数据分组后,得到一组组的数据,就是一个个的桶
3.指标
1.指标指的是对文档进行统计计算方式,又叫指标聚合。
2.强大之处就是,前面将数据经过一轮桶聚合,把数据分成一个个的桶之后,我们根据上面计算指标对桶内的数据进行统计。
4.举例说明
下面看个简单的聚合查询的例子:
假设存在一个order索引,存储了每一笔汽车销售订单,里面包含了汽车颜色字段color.
上面使用了terms桶聚合,而且没有明确指定指标聚合函数,默认使用的是Value Count聚合指标统计文档总数, 整个统计的意思是统计每一种汽车颜色的销量。
5.常用方法
常用的统计函数如下:
- Value Count - 类似sql的count函数,统计总数
- Cardinality - 类似SQL的count(DISTINCT 字段), 统计不重复的数据总数
- Avg - 求平均值
- Sum - 求和
- Max - 求最大值
- Min - 求最小值
4.上货 (需求:用户搜索热词检索出搜索最多的Top10)
1.首先检索热词,用户在input框输入的时候,每点查询,数据的信息都需要入库,好在咱们es中统计热词
2.插入就不展示了,就说说简单的热词如何分组排序显示。
3.Kibana操作
我觉得这样再看Java操作就很好理解了 ↓ ↓ ↓ ↓ ↓ ↓
4.Java操作
将最终结果,包括关键字以及该关键字的出现次数都return给前端,让前端大哥去处理把。
5.福利 (ES聚合用法)
本节只使用了最简单的类似SQL的group by的Es Terms()函数 更多细节有很多
ES常用的桶聚合如下:
1)Terms聚合 - 类似SQL的group by,根据字段唯一值分组
2)Histogram聚合 - 根据数值间隔分组,例如: 价格按100间隔分组,0、100、200、300等等
3)Date histogram聚合 - 根据时间间隔分组,例如:按月、按天、按小时分组
4)Range聚合 - 按数值范围分组,例如: 0-150一组,150-200一组,200-500一组。
提示:桶聚合一般不单独使用,都是配合指标聚合一起使用,对数据分组之后肯定要统计桶内数据,在ES中如果没有明确指定指标聚合,默认使用Value Count指标聚合,统计桶内文档总数。