00:00
接下来我们学习聚合aggregations,这是我们ES里边提供强大的数据分组以及提取以及分析能力的体现,它呢大致就等于我们买circle里边的这些,比如group by,比如一些circle的聚合函数,Count统计数量,Avg求值等等等等。那么ES呢,可以使用聚合帮我们将检索到的结果里边的这些数据来进行逐一分析,而且呢,它的这个分析跟检索是一次性的,就说我们一次请求过去,我们数据既能查出来,也能把这些数据我们分析到位,非常强大,也非常方便。我们举一个最简单的例子,比如我们想要搜索我们这个银行里边所有地址,里边包含mail的这些人,而且我们想要看他的年龄分布,要说比如28岁的人有几个,38岁的人有几个,包括我们想看他们的平均年龄,那做这些功能呢,我们就可以使用聚合,那这个聚合呢,详细我们就可以来参。
01:01
照文档前边我们检索了这个term,我们是在query d SL里边,我们说了这个查询领域语言,我们现在来看aggregations。那这里边呢,解释了我们这个聚合它可以支持多种聚合方式,包括呢,我们一个聚合的语法应该是这样子的,所以说我们这个aggregations,我们现在要做一个聚合,然后呢,为某一次聚合起一个名字,然后我们要做什么类型的聚合,它的这里边聚合类型超级多,我们也可以来参照文档,这里边基于bucket桶的聚合,包括有各种不同的聚合,有基于管道的不同种聚合,平均值的最大最小值的,包括基于监控信息的matrix,各种聚合可以看到各种指标信息的,那么现在呢,就来使用这个聚合语法,我们现在在这得指定聚合的类型,包括我们聚合体的内容,包括聚合里边有一些原数据,我们也可以来指定这我们第一个聚合,如果我们有更多的聚合,我们还可以写来聚合二,因为我们这儿可以是一个数字,我们聚合二该怎么做,聚合三,聚合四等等,更多包括呢,聚合里边。
02:12
除了第一个聚合,第二个聚合外,我们第一个聚合里边也可以再进行聚合,那就是基于上次的结果再进行一次分析查询,把这个称为子聚合,那么就先来体会我们第一个功能,我们现在的需求呢,就是这样子的。把它复制过来。我们来到我们的K里边,我们来看我们的现在需求,现在需求呢?我们搜索address中包含meal的所有人,而且要看他的年龄分布以及平均年龄,那么先来进行检索,Get bank刚search,那按照正常检索,我们先来写检索条件,你们要搜索。地址中包含me的,那我们的检索条件,那就是match match,我们这这个address中里边包含我们这个me,来复制一下,那如果我们只是这样来写,这是一个检索,我们总共检索出了四条记录,而我们要对这四条记录呢,我们还要进行分析,那分析所有人的年龄分布,那我们就要进行聚合,怎么聚合呢?我们在这来写一个叫AGGS。
03:20
我们在这儿quary,那这是查询,查询完了以后呢,基于上次的查询,我们要做一个聚合,那为这个聚合呢,首先要起一个聚合的名字,比如我们的名字就叫HHAJJ,我们现在想要聚合年龄,那聚合的类型是什么?我们想要看年龄分布,想想要看它们的这个值到底有多少H,有多少种不同的值,那么这里边呢,有一种聚合类型参照官方文档,在这里边呢,有一种聚合类型叫term,比如我们看bucket里边,那有一种聚合类型叫terms,这个aggression就是来看我们这个值到底有多少种可能的,那我们现在呢,就来说我们的聚合类型,现在就叫terms,那聚合的是哪个属性呢?我们相当于现在要看这个年龄分布,所以我们这个属性这块,我们写年龄SIZE10的意思就是呢,我们在聚合分析年龄的时候,假设年龄有100种可能,我们只取出十个,那前十个可能。
04:20
我们可以先看一下这个效果,我来进行运行,那现在呢,看到花费了咱们这个六毫秒的时间hits,那现在命中了四条记录,在这个hits里边呢,有我们命中的这四条记录,但是我们额外看到除了返回的这个hits外,我们还返回了一个叫aggregations。那在这个聚合里边,我们能看到有一个名字叫h agg,那这个h agg就是我们上次在这儿写的聚合的名字,说明我们有一个聚合名叫H的这个聚合,这个名字呢,随便起,接下来呢,聚合呢就会有结果,我们来把它展开,们看到呢,结果是这样子的,这有两个其他的指标信息,比如有没有什么错误的,这是零个,包括我们有没有统计到其他文档的数量,这是零个啊这块我们先不管,主要看这有一个叫8ETS,这是桶,好,我们来把它展开,那现在呢,能看到这个桶里边有三个对象,这三个对象呢,第一个叫K38,第二个呢K28,第三个K32,它的意思就是我们按照年龄的所有可能的值进行聚合,那年龄的值等于38的我们有两个,我们do count2,那就是两个年龄为28的do count1,那就是有一个年。
05:41
因为32的,那就是有一个,所以说呢,这就是我们第一个聚合,我们现现在看到年龄有多少种情况,现在呢,我想还想要看这四条记录所有人合起来的平均年龄,那么想要写第二个聚合怎么办呢?我们按照官方文档的这个聚合语法。
06:01
AJJS里边这是第一个聚合,第二个聚合,那就在下边继续写好,我们把第一个聚合给它结束掉,来写第二个聚合。比如呢,我们就叫avg,我们现在要求平均年龄。那接下来呢,我们这一块聚合类型是什么?那聚合类型参照文档里边,除了terms聚合外,我们在这些指标信息里边还有一个叫avg聚合,比如说我们求平均值的,我们就可以来写一个avg。我们求哪个字段的平均值,我们想求年龄的,那我们就来写一个年龄,这是年龄的平均值,好,我们现在呢,把它缩起来,我们相当于呢,对,基于查到这四个数据,我们要求两个聚合,一个是年龄的所有的值分布,第二个是年龄的平均值走,那查出的这个结果,His里面是命中记录,H aggg是它的分布,来看HAVG,我们求的平均年龄呢,是34.0,没问题,包括如果我还想求这所有人的平均薪资,那怎么求呢?我还可以继续来写一个,比如我们就叫balance。
07:15
Avg,好,有多少种聚合,我们都可以写多少种,我们现在还是来求平均值,我写一个avg,那么现在来求谁呢?我们求的是这个balance,我们可以看这四个人的平均薪资,好来查询一下,那查到的这些所有数据,我们先缩起来,在这个聚合里边HHGG我们现在呢,有年龄分布,38号两个,28的一个,32的一个,啊然后呢,年龄平均是34,然后呢,他们的总体平均薪资25208,我们现在呢,相当都查出来了,这就是我们说的聚合。包括呢,我们来再来进阶查询,包括我们以前说我们想不想看结果,不想看查到的结果,那么就可以在这儿在查询的时候来指定分页size,一次我们写一个零,我们不要任何记录,那我们现在相当于只看聚合结果,在hits里边呢,我们就不看我们命中的这个记录,但我们能知道命中了四条,我们聚合结果在下边都有们来进阶搜索,比如呢,我们现在想看我们年龄,按照年龄聚合,先看我们这些年龄分布,而且呢,我们要看这些年龄段的这些人的平均薪资,而且我们现在呢,是查询所有我们现在我们想要查所有人的这些平均薪资,而且呢是各个年龄段的来看一下我们的效果。
08:37
我来写一个get,还是来进行检索,我们刚search,我们现在要想查所有,我们就先来写我们的d SL query。这一块呢,就叫man all,那就行了,那至此呢,我们是查所有只有1000条记录,那接下来呢,我们先要聚合,按照年龄聚合,那我们就可以来写一个叫HJJS,那按照年龄聚合呢,我们先来写一个,给这个聚合起个名字叫HHGG。
09:07
我们聚合的类型,你们想看它的年龄分布有多少,我们就来写一个terms,我们看谁呢?我们来看这个h size,我们取上很多,哎,比如年龄分布呢,有100种情况,我们取掉100种,现在呢,我们第一个就写好了,我们先来看效果走,总共呢有1000条记录好命中的这些记录我们不看了,看我们的年龄分布,在这个年龄分布里边呢,我们来看一下,在这个8K里边一二我们来都来说一下,那随便看一下31号,相当于年龄为31的有61个人,年龄为我们39的60个,年龄26的有59个人,年龄32的52个人等等等等,一直在下边统计了我们所有年龄段的这些人员分布情况,这我们完成了第一个按照年龄聚合,但是呢,我们接下来还想看我们这些年龄段,比如37这个年龄段的人,他有42个,这42个人的平均薪资是多少,相当于我们要基于上一。
10:08
次的这个聚合结果,我们还想进行继续分析,那怎么办呢?那原来我们要做新聚合,那是跟它并列,我们往下写,那就是新聚合了。当我们想要基于agg GH agg的这次聚合结果再次进行分析,我就可以在它的里边,这是特斯,这是它最终的结果,我们在它的里边继续进行子聚合,子聚合我们是按照什么的聚合呢?我们先为聚合起一个名字,那叫HAVG,我们求它的平均年龄的。聚合的类型是什么?我们就是avg,我们求平均值的,求谁的平均值,求它的这个薪资,比如我们就叫balance,我们现在再来进行检索走,花费了30毫秒,还是1000条记录,我们命中的记录呢,我们就不看了,来看我们的聚合结果,HHGG,想来我们最大的聚合呢,是这个HHGG,好,我们把它展开,我们现在来统计年龄分布,在这个八桶里边呢,有各种年龄分布,我们在这儿都有,那先来看第一个三来31号,31年龄的有61个人,他们的这个平均工资是28312,接下来继续,那39号有60个人,他们平均是25269,一直等等等等,我们下边求出了各种,比如40号45个人,他们的平均薪资,这叫HAVG,他们的值就是我们的这个27183,那这块呢,我们就是用了子聚合完成了这个功能。
11:38
那我们继续进阶,我们再来做一个复杂的分析来看一下,那现在呢,又有这么一个需求,还是按照年龄聚合,我们要求出这些年龄段这些人的平均薪资,我们之前求过了,我们现在用这个好复制过来。现在我们来看一下这个需求,先查出我们年龄的这些分布,并且呢,我们要看这个年龄段中,比如38号,它里边呢,性别是M的这些人的平均薪资和性别F的平均薪资相当,分别统计男女不同的平均薪资。
12:18
以及这个年龄段总体的平均薪资,那总体的平均薪资呢,我们在这儿HAVG,这其实都有,现在相当于我们要基于这个38这个年龄有39个人,我们又要区分成男和女,不同的男女呢又要求出他的平均薪资,那这一块怎么做呢?我们还是一样,好我来写上get,比如我们去叫bank-search,我们现在先来查询所有先写po条件match or好,我们想要按照这些聚合来写AJGS,那么最大的聚合首先要看年龄分布,那么先按照年龄进行一个聚合,H aggg。要看它的这个直分布,我们使用terms这种聚合方式来看一下我们这个年龄分布,我们列出100种不同可能,这是我们做的第一步,我们就做好了,我们能看到我们每每一个的这个年龄分布,31号,31岁的,我们现在有61个人,39有60个人,接下来呢,我们还想要基于这个年龄分布,我们要求出M的平均薪资和F的平均薪资,所以呢,现在我们得把每一个聚合,我们先来看31岁,M有多少个人,F有多少个人。
13:31
所以呢,我们基于这个聚合h agg里边我们呢,还要基于这个聚合,我们进行再次聚合,按照它的性别再来聚合一下,我们就叫真的AJ聚合的方式是什么呢?我们还是terms进行聚合,我们来写上我们的这个聚合条件terms,那么呢,这个聚合呢,我们的field,那么就是按照我们的这个叫真的进行聚合,因为真的呢只有两种可能,所以我们这个size呢,也可以不用写了,我们现在来运行一下。
14:04
这块机制有错误,哎,我们这个语法写错了,哎,我们不能直接上来这么来写,如果我们要基于上一次的结果再来进行进行聚合,我们首先得写一个叫AJJS,我们又要聚合了,接下来呢,才能给聚合起一个名字,我们就叫真的agg。我们现在要按照性别进行term,看到它的值分布,我们按照针段来进行聚合,我们现在来看一下它的结果,在这个结果这呢,报了一个错误,它提示说我们这是一个文本字段,就说我们这个真的它是一个test类型的字段,我们想要聚合呢,它没法进行一些计算,所以呢,我们应该使用这个keyword属性来进行替代,所以我们在文本字段聚合的时候,在这一块我们一定要来写上keyword,进行精确的匹配,把值看它有多少种分布情况,好,我们现在来看一下,现在的结果呢,是HAJJ31岁的有61个人,然后呢,这61个人我们又对他做了一个分析,按照性别进行聚合,这个聚合呢,出现了这两种结果,M的有35个人,F的有26个人,那我又想求出M的平均薪资和F的平均薪资。
15:21
那接下来怎么办呢?像基于这个真的agg,我们又要再次进行聚合,所以呢,在它的这个真的agg,这是我们这次聚合啊,一缩,我们在它的里边特Y我们还要再聚合,基于这个结果继续聚合。那聚合什么呢?我们要求每一个不同性别人的平均薪资,所以我们写了一个balance,我们就叫balance avg。好,我们给这个聚合起了一个名字,聚合的类型我们就叫avg,聚合用的属性,那就是这个balance。我们要求他们的平均薪资好测试一下,现在这个结果呢,我们来展开看一下,31岁的有61个人,这61个人按照年龄再次聚合,聚合出来M的有35个人,M的有26个人,那M的平均薪资是29569,那M的平均薪资呢是26626,那这是第一条记录,31岁的同样39岁的60个人,F38个,M22个,每一个。
16:28
性别的平均薪资也都计算出来了,而且呢,我们还要计算这个年龄段的总体平均薪资,所以相当于我们在这聚合年龄的时候,我们给年龄分了MF,现在呢,我们除了分MF外,我们还要给它的整个年龄段再进行聚合求平均值,我们现在不是给MF里边求了,就是给这个年龄HHGG求,所以我们把这个子聚合又写到HHGG里面,当然这一块呢,直接报错,现在他说有多个这个子聚合,那多个子聚合呢,肯定就应该写在一起,我们这个agg里边呢,包含了第一个按照我们这个性别进行聚合。
17:10
现在呢,我们就要按照我们这个年龄的这个分布,我们求出它的这个年龄的基于这个年龄段的。这个平均薪资balance avg。好,我们现在又用一个它我们的聚合类型,那就是avg,那聚合类型是聚合的哪个字段呢?是这个balance为它来求平均值,好,我们现在再来运行一下,那最终的结果呢,就长这样,我们来进行年龄聚合,31岁的有61个人,这61个人呢,我们又做了两种不同的聚合。第一种看61个人里边M有多少个,F有多少个,第二种看这61个人的平均薪资,我们在这儿能看到这61个人是28312,而每一个性别对应的平均薪资这一块呢,也都有统计,那这就是我们最终的聚合的使用,我们在这呢来回使用了两个,一个叫term,一个叫avg,那聚合类型呢,有非常多,比如参照我们这个文档,有求平均值的,有求最大最小值的,还有我们这个求总和的等等等等,除了这个聚合类型外,还有同类的这个聚合,管道聚合,那聚合里边有各种不同的聚合,还有基于日期直方图的及日期顺序的聚合等等等等。那我们呢,后来也会用到这里边的几个复杂聚合,那么就通过这个聚合aggregations来体会了EL search强大的数据分析能力。
18:44
它的整个完整用法,大家就继续来参照文档进行使用就行了。那在这儿呢,只来说一下我们后来经常要用的这些东西。
我来说两句