00:00
下面我们对照页面呢,编写了这些模糊匹配、过滤排序、分页查询等等各种操作,接下来我们就来说最难的这个聚合分析。我们现在的需求就是我们这一块展示的所有内容都是我们查到的这些商品他们所拥有的可供选择的内容,所以呢,我们必须分析我们这些商品到底都拥有哪些属性,包括他们所涉及哪些品牌,以及他们涉及哪些分类等等等等,这些信息呢,我们都要取出来,好,那么就在这一块来做我们这个聚合分析,那做这个聚合分析呢,好,为了简单起见,我们就不来先加上我们这些复杂的查询条件,本来就数据少,查询条件一加,我们就看不到效果了,那们现在呢,就是来查所有。我们来聚合分析我们所有的这个数据,那以前呢,我们这个查询,我们在这儿会写一个query,我们的查询条件有很多,现在我直接没车啊,现在我们就是查到所有,那将所有的这个商品,我们来分析他们到底所属于哪些品牌,所以呢,我们先来分析第一个我们叫AJJS,那AJJS呢,这就叫聚合分析,那聚合分析我们先来分析第一个它们都属于哪些品牌。
01:16
所以呢,我们先要为这个分析起一个名字,我们比如就叫brand agg,好,我们就叫品牌的聚合,这个聚合的类型,由于每一个人的品牌都是一个固定值,比如它是九号、十号,那么就来看他们所属于到底哪几种品牌的ID,所以聚合类型呢,你就来写它有一个叫term,按照term进行聚合,聚合的属性我们就叫brand ID,而且呢,品牌可能有很多,我们一次要几个,这默认十,比如我们所涉及能有100种品牌,那我们就来最大写一个100,如我们写一个十,那意思呢,我们最大只返回我们聚合出的这十个,好,那么就来写一个十,来给大家看一下走。
02:00
我们现在呢,查询总共有26条记录,His里边呢,都是命中的记录,别的不看,看我们这个命中记录下边有一个aggregations,这里边呢就是我们的聚合,聚合里边我们当时起了一个聚合名叫brand agg,好就叫它,我们想看到底有多少种品牌,那就在这个桶里边,好,那就有这么几种,一个是12号品牌,一个是19号品牌,相当于我们就把品牌的ID。我们就拿到了,我们现在有两种不同的品牌,而且12号品牌的商品有18个,九号品牌的商品有八个,相当于我们在这儿呢,聚合到了品牌,包括我们还想看这商品所属于哪些分类,我们想要再来聚合,我们就可以再在这来写,这只是第一个聚合叫brand agg,好我们可以再来自己再来写一个聚合,比我们就叫cat log agg,那还想要看它们的所属于的分类,那这个分类呢,我们当然精确值的聚合还是使用term,我们就想要看它的catallo ID,我们看它们到底能属于多少种分类,好我们来查询一下,那还是不用看命中的结果,我们只来看它聚合的结果,所属的分类只有一个225,相当于225这个分类有26个商品,那这一块呢,都还比较简单,但是我们现在来看,那现在虽然知道了我们的品牌设计了多少分类设计。
03:31
给了多少?当然我们现在只知道了分类的ID,那分类的名字之类的,我们能不能知道呢?我们可以两种办法,第一种我们给你聚合出来的关键信息,你拿过去,你想看他的其他信息,比如品牌的名字,品牌的图片,你再去数据库或者缓存,照着品牌的ID去一查,你就能查到这我们第一种可以再次检索,第二种我们也可以直接在聚合的时候得到这个结果,比如我们来聚合品牌,能看到这个品牌呢,聚合出了12跟九,相当于两个品牌,但这些品牌都叫什么名字呀?我们还想看这个东西,怎么看呢?我们就可以给大家说,还有一个叫子聚合,比如我们这个term,在brand agg里边,我们现在呢,聚合了品牌的ID,我们相当知道了这几种品牌ID,那么还能在它的里边来继续聚合,写一个AJJS,那这个AJJS就相当是于。
04:31
我们品牌里边的子聚合,子聚合呢,就能用到上一次聚合的数据,我们上一次呢,聚合已经得到它的ID了,那我再来基于这个ID,我来看12号这个品牌的ID,它有。多少种名字,其实一种品牌ID只有一种名字,所以们还是利用terms聚合,比如我们来起一个名字,那就叫brand name的agg,那现在就想得到它的名字,我们就使用terms terms呢我们属性只要我们的brand name,那这样我们相当于就知道了品牌的名字,诶我们就是通过子聚合的方式,我们来给大家看一下,我发现呢,这一块报了一个错,这个错误呢,说不能加载我们这个brand name这个数据,因为我们这个数据呢,不支持我们keyword类型,那这就是我们当时再来分析我们这个索引属性的时候,我们说这个品牌的名字,我们只来看一下,我们不进行查询,不进行这这种聚合doc values统计数据,所以呢,它这一块的这个统计数据,他说就是有问题的。
05:40
我们这个dock values呢,我们就必须给它设置为true,那么呢,接下来就把它的映射改一下,我们不让它的这个默认的这个映射,这个dock value是first,那现在呢,把它们都改为index dock value,我们全都改为true,其实只改一个dock value是就没问题了,那么现在呢,就把他们都来改一下,所有以前设置过的这个,那全部呢。
06:04
就不加这两个设置了,好我们把这个映射我来拿过来,这是我们的映射CTRLC,我们想要改映射,我们说是这样子的。由于我们这个映射改了,以前的数据还是老映射,没办法,所以我们以前说这种改映射数据还想要变过来,我们得用数据迁移,数据迁移的步骤就是我们先来创建一个新的索引,好,我现在来创建一个新的索引,比如我就叫put来创建一个,我们就叫鼓励ma-product,我们就创建一个这个索引,这个索引呢,我们来给它保存它的这个映射,那我们直接把这个映射拿过来就行了。我们就像给之前的这个索引保存一样,好把这个映射拿来,把我们要改的改掉,把所有的这个dock value index我们就去掉,以前分析的时候呢,说这种情况我们可以给它加上,现在我们要用到了,我就把这个去掉,我把这个去掉好,我们把这一块呢都去掉,所有的这些都去掉。
07:07
包括我们at tr的name我们也去掉。那去掉了以后,我们的这个映射mans,由于我们的所有映射,我们现在直接是一个mans,所以我把product这个去掉,再来去掉它的一个大括号。好,我们把这个格式化一下,这是我们新的这个映射,那新的映射呢,来给它执行,那现在相当于创建了一个索引,叫古力ma product。跟原来的这个product是一模一样的,那接下来我们就把这个数据转移过去,好现在我们来看我们新的索引,这个叫古mail product,好走,这个索引里边呢,是没有任何数据的,这是它的映射信息,来给他查一下所有数据走。那现在呢,没有任何数据,我们把数据呢,迁移过来,来写一个迁移数据,把以前的老数据迁移,那迁移呢,按照我们以前ES来讲的这种方式来迁移就行了,直接发送post index,也就是说我们现在要重新保存我们这个数据,诶这一块呢,是固定写法post index,那接下来我们就来设置上我们的重新迁移的信息,我把这一块复制过来,这迁移要用的DSL,好,我把这个复制过来,Source,比如说我们原数据,原数据呢,就是我们这个product这个索引下的,买它的所有的数据迁移到这个里边,好,我们来运行一下我们这个功能走。
08:35
那数据呢,都迁移过来,我们现在再来查询走。那现在呢,我们就有26个数据没什么问题了,而且我们只要查过以后呢,以后查询都挺快的,好现在我们就来聚合,我们用新的索引来进行聚合。以前的这个老聚合呢,这个索引就没得用了,我们就用鼓励mail product,包括我们一定要修改。
09:00
我们这个service里边,我们service里边当时无论是保存上架之类的我们商品的,所以呢,我们专门抽取了一个产量,这个产量正好我们来变一下叫古丽麦尔。那现在这个索引变了杠product。好,接下来我们来继续,那现在呢,用到新的索引,那现在可以允许brand name进行聚合了,我们来给大家看一下我们的效果走。那现在我们来看命中的记录,不看我们来看聚合的结果,那主要来看品牌,那品牌的聚合结果,首先呢,它有一个bucket bucket里边聚合了两个结果,相当于两种品牌,一个是12号的,一个呢是九号的,12号有18个文档,九号呢有八个文档,然后接下来我们又在它里边做了一个子聚合,在brand agg里边又用了一个aggs做了个子聚合,叫brand name agg,那在brand name agg里边,相当于我们聚合了12号这个品牌,它的名字叫Apple,包括呢,我们的这个九号这个品牌,它的名字叫华为,这个名字呢,都在这个子聚和brand name agg里边,所以我们就能看到这个数据,包括我们除了看我们品牌的名字外,我们还可能想要看品牌的图片,因为我们还要返回给前端这个品牌的图片,那我们顺便聚合了,我们就直接加上品牌的图片。
10:27
品牌的图片呢,我不用在品牌的名字里边再次聚合,我们写一个同级聚合,因为他们呢都是一个品牌ID对应一个名字一个图片的,但是你把这个图片写到name里边,你再深入一层看华为的内层看图片也是可以看的,但我呢写成两个评级的,这也是没问题,我们还是使用咱们这个terms们按照品牌的图片来进行聚合。来给大家看一下效果走,那么最终呢,聚合效果呢,我们主要来看品牌,那么这个品牌品牌的agg里边主要有两个子聚合在它的这个桶里边,好我们找到了两个品牌数据,两个品牌数据呢,首先聚合个品牌图片,再聚合个品牌名字,现在我们就能知道12号品牌,品牌的图片是这个,然后呢,它的品牌的名字是下边的这个Apple,包括呢,我们再来看我们的九号品牌,九号品牌品牌的图片是我们这个指定的,好,这是在品牌图片里的聚合,而品牌的名字我们这个华为这都没问题,那么品牌的信息我们就能拿到,同样的分类也一样,那分类呢,除了要他的这个ID外。
11:43
我们还要它显示它的名字,比如我们所涉及到的商品可能有很多分类,我们在这儿还要展示一个分类,然后呢,有多种分类供我们选择,所以呢,我们这个分类既要有ID,还要有名字,名字要用来进行展示的,所以在分类的这个聚合里边,Term我们先分析出有多少种分类,然后呢再来进行一个子聚合,看每一个分类的名字是什么来,我们现在呢,就叫cat log name agg啊cat log刚name agg来看一下它的名字是什么名字这种呢都用terms来进行聚合,那现在分类的名字就叫catlo name,好,我们现在继行继续来查询,那看我们的聚合结果,那除了品牌这个我们之前都分析果接下来分类,分类呢有一个分类,这个分类的名字是什么,那在这一个分类下,又做了catalog name这个子聚合catalog name来看给大家看一下,就是它那做了这个子聚合子聚合。
12:44
里边有分类的名字,现在225号只有一个名字叫手机有26个文档都在使用这个名字,好没问题,那么这个呢,分类就做好了,那现在是分类的聚合,品牌的聚合都做好了,但是呢,接下来最复杂的是我们这一块来看一下,我们要查出所有查到的商品所涉及到的所有属性,所以我们要聚合它们的属性,到底属性有多少种,所以我们再来写一个聚合。
13:16
在所有的聚合里边,品牌的大聚合,分类的大聚合,我们都做好了,你再来聚合一个属性,A tr杠,Agg,那这个属性怎么聚合呢?我们就来看这些商品到底涉及了多少种属性,而且每一种属性是什么名字,它都有多少种值,我们都要给它分析出来,那么就在这一块来进行分析,那先来写一个terms,那先来看它的属性有多少种,那这个属性呢,直接用at t RA来区分就行了。好,我们现在来看一下这个聚合,我们来到这一块的聚合结果,来看一下我们的这个at t的聚合,走at tr聚合在这,那at t rid有多少种,我们发现,诶它一个结果都聚合不出来,原因是什么?还是我们之前说的,由于我们这个商品的这个映射,我们这个映射at tr,它是一个嵌入式的,所以我们会发现我们嵌入式来要进行查询。
14:17
的时候,我们得用这个嵌入式的,好,我们声明是嵌入式的,查询得用嵌入式的,而且我们聚合也得用嵌入式的,所以我们在这儿一定要注意,如果是咱们这个嵌入式的,咱们这个属性查询、聚合以及未来的所有分析都应该用我们这个嵌入式的,嵌入式的咱们这种方式,所以呢,我们的这个聚合就不能这么来写了,那嵌入式的这个聚合怎么写呢?我们还是来参照文档,文档呢,我们继续来搜这个list,好listed,那现在呢,相当于要有一个嵌入式的聚合,诶就在这这有一个嵌入式的聚合,包括这个也是一个嵌入式的聚合,我们来点进来看一下,那么这个嵌入式的聚合该怎么写,如果我们声明了一个文档它是嵌入式的,我们来看它的这个聚合,它在这呢保存了一个文档,他想要聚合。
15:17
啊,先给聚合起一个名字,由于我们是嵌入式的,所以上来必须声明我们是一个。我们是一个嵌入式的聚合,再来声明它的pass,这个pass呢,就是当时嵌入式的时候,我们的这个属性的名,我们叫这个reelor,所以这一块pass就叫reel,好,那我么接下来这一块我们的at tr,这个agg它就麻烦了,不能直接来写terms,把这块呢删掉,我们来看这人家的文档是我们先起完一个名,然后呢再声明我们是一个嵌入聚合,所以我们就在这里边先来声明,好,我们是一个嵌入式的聚合,在这个pass里边声明我们是嵌入式的哪个属性的聚合,我们的属性叫at t RS,好,我们把这个加上,接下来继续来看怎么写,接下来呢,在这个嵌入式声明完了以后,在它下边重新聚合来写agg好,跟嵌入式同级的里边来重新来写agg好,我们现在来聚合,现在聚合呢,我们先来看它的ID有多少种。
16:24
我们就来看AT来给它一个聚合,这种聚合呢,我们使用terms来进行聚合,这种聚合我们就直接来写at t sat t,我们就看出它的at t到底有多少种,来看一下走,来看一下这个最终的聚合结果我们来到这catalog不看at tr主要看诶我们现在终于分析出来了,我们现在这么多的商品,15号属性的有26个人,16号属性的也有26个人,那终于是将属性的ID那么聚合出来了,但每一个属性我们还想要看。
17:02
它的名字是什么,包括它的值到底有多少种,所以这个名字值呢,它都是基于这个ID的,一个ID对应一个属性名,而且呢,一个ID对应多种属性值,比如我们现在有十个商品,它都是15号颜色,有些是白色,有些是黑色,但是呢名都是一样的,所以我们现在想要统计出15号的属性名,那么就可以基于at t RI,那在它里边再做一个子聚合,我看一下它的属性名at JS,我们给它起一个名字,我们就叫at tr name的agg a tr-name的agg GA,好,Agg GA,我们就想看它的属性名,我就来写一个term term呢主要来看at tr tr name它们的属性名有多少种,可能好我们来走。我们现在来看一下我们的分析的结果,Cat log a d tr15号它的属性名是CPU品牌,但是我们还想要看15号到底有多少种属性值,所以呢,我们在它的这个属性名聚合完了以后,我们再来让它分析一个属性值,就叫at tr y6的这个agg g,那看它到底有多少种属性值,那还是使用term,那么聚合的是at tr。
18:24
At tr y6,好,那相当于呢,某一个属性ID,我们要分析它的名字和值都有哪些种情况,好,我们再来聚合,走们看一下分析的这个聚合结果,这个聚合结果里边catlo不看了,好属性属性的ID15号是CPU品牌,它的名字我们知道,那到底这个属性有多少种值?诶我们看到at tr value里边也统计出来了。以官网为准,以及海思这两个值,这个呢有18个,这个呢有八个,那我们发现我们属性的信息在这呢,终于也算聚合成功了,包括16号CPU型号有这么两种,A13仿生,还有麒麟,我们970,我们都拿到了我们当前的这个商品里边所有的属性值,而且注意我们在这分析的就是基于我们前面的查询结果的,比如我们查询的条件变了,我们现在假设我们就只来查询了一个,比如品牌ID,我们是九号的这个东西。
19:26
那它的这个聚合结果肯定不一样,走,那九号的商品呢,只有八个,这九号品牌ID是九号的,我们来看它的分类呢,都属于手机类,然后呢,它的at tr我们先不看,先看品牌,九号品牌就是我们说的华为,来看华为品牌的这些属性分布,好华为品牌16个,相当于我们查到16个记录,那16个呢,他们的这个属性,15号属性,15号属性呢,它的名叫CPU品牌,而它所涉及到的值,所有的华为CPU品牌只涉及了一个值,叫海思,还有它的16号属性就是CPU型号。
20:07
只涉及到了一个值,就是970,那不像是我们之前查所有既有970,还有A13仿生,所以这就是我们所有的聚合条件,那么最终一个查询最完整的,那就是我们的查询条件,还要拿到聚合,那聚合完了以后我们返回的结果,这就是我们的数据,还有我们聚合区的内容就在这一块,所以我们所有的查询。语句要发送完整,我把这一块呢复制过来,查询语句要发送完整,那就是前面的查询功能,再带上我们后边加上的这个聚合功能,那这个就是我们整个的DSL,好把这个呢缩一下,每一个功能我们有聚合,高亮,分页排序,包括我们的这一块,我们的过滤以及我们模糊匹配的查询,这是我们进行一个检索要用的所有功能。
21:03
而且我们这些的条件有些呢都是页面带了才有的,页面没带就没有我们条件呢,一切也都是动态的,好我们的DSL语句我们先分析完了,我们把这个语句呢,也给大家在检索项目里边来放一份。我们以前这是商品的映射信息,我们的DSL语句DSL,我们的查询语句呢,就长这样,好,我们来复制过来,这是我们的查询语句的内容。那为了好看,我们shift f6能给大家变成一个TS,这一块呢,也就好看多了,我们就可以来分析出它的这个结构,这是我们的DSL语句,我们商品映射我们也重新改了,我们就来写一个新的映射们new,一个map,这是我们的新映射new product的。那新的映射信息呢,是这样子的,走,把新的映射信息我们也复制过来,那从我们这一块拿过来我们以前的新映射信息。
22:05
就在这儿。好,来复制过来,这是我们的新的映射,包括我们新映射呢,也是给这一块来发送请求,我们相当于创建了一个新的索引啊,大家呢,来做一个参照,我把这个注掉吧,那我们下一节课就来连通到我们的service。我们让service帮我们来构建出这段DSL语句,那这个复杂的DSL,因为这DSL呢,都是根据条件动态构建的,所以我们下一节课的所有内容就是动态构建出查询需要的DSL语句。
我来说两句