00:00
来吧,我们继续说啊。呃,最后我们再讲一个聚合查询啊,那这个聚合的话,我们也是基于一个这个需求来写啊。之前也做过啊。就是查询一下这个每位演员啊,参演了这个电影的平均分。啊,然后呢,做一个倒序排序。好吧,行,那你拿到这个需求以后呢,首先还是啊,先不着急写代码啊,你还是先回到这个就是可以办的中啊,我们先去正常写一个DSL。你先把这个DSL写出来以后呢,再考虑写写那个代码啊,行,那我们写一下吧,呃,还是查我们这个movie index啊。那行吧,查这个more index啊OK,然后呢,呃。好,这个里面写什么呀,这个里面不就是每个演员参演的电影的平均分,那你肯定要什么先分组,然后呢,在组内的求一个平均对吧,那分组的话就是HJS。
01:01
OK,那给个名字吧,比如说我们叫group group,什么BYBY谁呀,BY这个演员的名字啊,找act name好吧,这个名字你随便写一个啊,行,这个类型的话呢,你说你要按照演员的名字呢,去做这个分组操作,那我们要去做一个职等判断啊,是吧,还是一个特姆斯啊,然后这里面这个字段的话,我们写的就是演员的名字啊,叫act list name的keyword啊,因为我们目前这个索引的话呢,它的名字呢,也是纯了两份啊,一个是倒牌,一个是这个列唇啊,那我们要使用这个列唇的方式啊。行,那这个分组的话呢,这个分多少个组,你就看情况啊,像我们目前这个数据的话呢,总共加起来也没几个演员啊,所以你这个分个十个组肯定是够用的。对吧,如果他分不了这么多,那就按照实际来给你分。好吧,行,那这个分组分好以后呢,接下来就是你在组内呢,要去求这个平均啊,那怎么求平均呢?来这是我的组啊,那我在分组内我要写一个再写一个HJS,这里面就是求我们这个平均了啊,那这个名字也取一个啊,我们叫这个豆瓣扣的这个avg。
02:07
对吧,类型的话,那肯定就是avg了啊,因为你求的是平均嘛啊,那你通过哪个字段去求这个平均呢?那你通过是这个豆瓣S求的平均。对不对啊,那把这个求出来以后呢,我们还有一个什么倒序排序对吧?倒序排序的话呢,你是根据分组以后求了这个平均值做了倒序排序,所以说你这个排序呢,需要写到这个term里面啊,我们叫做order,好order里面这个K写什么呢?K就写你求平均值的这个K啊,求平均值的这个名字。OK吧,然后呢,倒叙的话就是DC。行,那这就是我们这个写好的一个DSL来执行一下,这个执行的时候你会看到啊,他会把这个明细也查出来,但其实这一次呢,我们是不要明细的啊,我们重点关心的还是最后的这个结果。对吧,你看这个海清呢,8.5,然后张宇8.5,然后张涵宇8.25,然后ID是5.0,那如果说你不要明细的话呢,你可以在这个追外城啊,在这个追外城,然后呢,写一个size,就是不要明细啊,那我们写个零啊,表示不要明细。
03:07
好,那你再查的时候呢,OK,它就没有明细了啊,只有一个聚合的结果对吧,所以说你看啊,现在我们就可以把这个拿过来。开始去写代码了啊,写代码好来写吧,呃,那我们先写一个方法啊DF,我们叫search hg啊。OK,呃,还是一样的啊,我们还是通过client,然后呢做一个search操作,这里面的话我们需要传上一个search request。好接收回来,然后呢,把这个呢传过来,就一条的套呗。对吧,呃,刚才这个同学这个用了一下这个现在这个网络热语对吧,大肠包小肠是吧?啊这个套娃知道吧,一层一层往里面套啊行,然后这个search request里面的话,我们有一个叫做source的操作啊,我们需要给他准备一个search source build search source build啊好,这时回来,这是我们的,呃,诶完了。
04:13
重来啊好,Search s build啊行,把这个拿过来,然后呢,放到这个里面对吧。好,呃,然后这个里面我们还得给一下这个索引的名字啊,那么写到这儿吧,这里面是可以给给索影名字的啊,我们还是叫这个movie index。没毛病吧,同学们看,还写这个more index啊,OK,行,那接下来就是封装呗。首先啊,这个进来以后啊,你可以先把这个size给他搞了啊,就是这个不要明细啊,那就什么search source build size0这是不要明细啊,下面就是你先得做group啊,你group完事以后呢,你才能够做这个avg,好,那这个group的话,我们要的是一个AJS啊,这个怎么创建呢?
05:01
呃,这个的话你看一下啊,它这个search source build里面啊,它是有这个就是叫aggregation的。能看到吧,它是可以去什么设置这个aggregation的啊,然后这里面我们要给的是一个aggregation的一个build啊,那我们就什么写一个叫aggregation啊好,它需要我们传一个agg build,那么大家可能会想的说,那我拗一个吧,对吧,Aggreg build。你在扭的时候,你发现这个东西扭不了。为什么用不了呢?因为这个类啊,你仔细瞅瞅这个类啊,它是不完整的一个类。对吧,说是你拗不了的,那么拗不了的情况下,你就要去想一下,他既然要用这个东西,但是他不让你拗,那么他一定会提供一种方式,然后让你去获取,那么这个时候你就要去找找啊,谁能够帮你去创建它,好吧,这个我就不再给你,呃,啰嗦了哈,直接告诉你,我们有一个叫做aggregation build斯啊,就这哥们他是可以帮我创建这个aggregation build的啊,所以我们直接用它了啊,就不拗了,叫。
06:01
AG aggreg啊,这个标四啊,然后呢,这里面我们就可以写了啊,比如现在我们是一个分组,分组的话呢,就是一个呃,分组的话我们用的是一个这个termm来做的这个分组操作,对吧,那你写一个什么叫做term姆斯啊,对吧?然后这个term姆斯里面写什么东西呢?首先啊,这个分组的名字就是这个名字,你要给他指定上啊,那我们写一个叫做group by。然后呢,Act name好吧,那你分组的话呢,这里面你的分组字段是谁呢?你再接着写,你看这个field分组字段,比如说我们写的是act list啊,这个千万不要写错了哈。我加个行吧,调的是act list的name的keyword,不要写错啊,然后呢,你分多少个组,那你再去调一个什么叫做点点什么点这个size啊,这是分多少个主啊,那比如说我分上这个,呃,那我就写个40个主吧,对吧,这个写好以后你接收回来啊,这就是我们的一个叫做呃,Terms的这个a builds。
07:06
那你就可以把这个东西啊,直接传到它里面。看明白了吧,穿到它里面就行了啊行,然后呢,你这个分好组以后呢,注意啊,你分了组以后呢,接下来就是你的avg了,那这个avg的话,应该是在我这个分组以分组里面去做的,所以说你看啊,在你这个分了组以后呢,在它里面我们再去写一个aggregations。它叫什么?它叫做sub aggregation,就是它一个什么子聚合对不对,来叫什么叫这个sub aggregation好,还是要一个build,那我们还是通过通过什么,通过这个叫做aggreg build斯好,然后呢,写一个这个就是一个avg的操作了,对吧?所以看看它有一个avg好,呃,同样这里面需要你给一个名字,名字的话,我们就叫做豆瓣,呃,豆瓣这个s score的一个avg好,然后呢,你的分组的字段指定一下field,比如说我们就叫什么,就叫这个豆瓣SK啊写过来。
08:00
啊,多半思扣好接收回来啊,像这是我们的一个avg的一个什么这个标准四,然后你再把它呀放到这里面。能不看得懂,好再把它放进来啊,行,那你把这个放进去以后呢,你看啊,我们的这一部分也就完成了,那最后我们还差一个这个order,这个order的话,是不是还是属于我这个特姆斯的操作呀,所以你再接着去点啊点这个order。对吧,然后这个order的话,我们写的是按照谁去做这个分组,对吧,那这个order里面我们看一下需要传什么东西呢?它需要传一个。传一个b order。能不能看得懂啊,传一个他哈,那我们就呃用一个bucket bucket这个order呃。完了用不了是吧。呃,你有不了的话我看看啊,嗯。扭不了,扭不了的话,那我们就得想个办法了,对吧,看看啊,Order里面他要传一个,嗯,诶。
09:01
我是点了一个,呃,在这点order是吧。呃,他要返回一个,就是给你返回一个啊,但是我们要调的是这个传一个啊,我看看啊这个。Bucket order不让你拗,那我就。不然我扭的话,那我看它里面有有没有什么东西啊bucket order点诶你看它里面有一个方法叫这个aggg。对吧,应该是什么?这个就给你返回一个bucket order对不对啊,那正好用它就行了啊,来找aggre啊行,那这里面要写什么东西啊,就是你要按照谁去做这个排序,那我们排序的话呢,不应该就是拿我们刚刚写的这个名字嘛,对吧,就豆瓣S扣这个名字啊去做这个排序。然后了吧,然后呢,呃,除了这个排序之外的话呢,我们还得再传一个就是你这个排序的,诶排序的方式啊呃,这个asc它是一个布尔,那说明什么,这个是一个声序,升序处理应该就是声序,那倒叙应该就是一个false。对吧,这就把它设置好了啊OK,行,那把这个都写完以后呢,我们的。这个search的操作就已经完事了。
10:03
对吧,你就什么一个一个给它套进来,套套出来就完事了啊好,那完事以后的话,我们把这个结果呢接收回来,接收回来以后就是一个search response,好,那接下来我们要看这个结果了啊。呃,结果的话呢,我们刚刚查过了啊,这就是我们那个结果,那我需要把这个结果呢给他拿回来。就是那个结果啊,拿回来好放到这,然后呢,接下来我们再来去写啊,这个结果中我们要什么呀?那我们要的是每个演员参演的电影的平均分,那我就知道你的演员跟平均分是吧?所以你看一下啊,这个结果中我们就可以拿到你的bucket,然后呢,再去拿你的演员平均分,对吧?演员平均分啊,来拿一下吧,怎么拿呢?Search response点首先get什么呀,这是你聚合的结果啊,同学们首先叫get obgggggs。明白吧,给你返回的是这个aggregations。能不能看明白啊,然后呢,这个aggregations里面,你再去什么做一个get操作,呃,这个get什么呢?这个get就是你具体的那个聚合,那我具体的聚合应该就是它。
11:05
对不对。就你取的这个名字啊,说是你要把这个名字给它写进去,来,我们要取哪个聚合啊,Group。BYBY,谁呢?By actor name,我要取这个聚合。好,那我刚刚调方法的时候,我发现这个方法它是可以,呃前面是可以什么给一个什么,这个呃相于是有泛型的对不对,相当于是有泛型的啊,你看一下我在这个提示的时候,它提示到了哈,对吧,是可以给范闲的。能理解吧,好,呃,那我们看一下啊,他给我返回什么东西啊。他给我返回的是一个,诶不对呀。返回的是一个unit,那因为unit的话应该就是你没有给泛行了啊,那么还是要需要指定泛型的啊呃,那这个返回的结果,那你aggreg你返回的结果那肯定还是一个aggreg了呗。对吧,肯定还是一个aggreg啊,所以我们要写一个aggreg。
12:01
呃,应该是。应该是这个aggregations吧。不是啊,呃,不是他这个我们具体拿到的应该就是一个AG啊,我找找啊,有没有这个类啊。Re。有吧,对吧,我们应该拿到是一个aggregation啊,来这个介绍回来,呃,那你拿到这个aggregation以后,这是由我们go的一个什么呀,Go的一个,呃,Aggregation。对不对,好,那你拿到它以后,大家注意哈,接下来我们正常就可以什么从它那边去提这个bucket了啊,但是呢,你发现现在我是提不出来的啊,讲什么get bucket它没有,它提不出来,这个为什么提不出来呢?啊给他去说一下,因为这个它是一个就我们现在这个类型,它是一个比较大的一个类型,你点过来啊,它是一个接口。理解吧,但实际上的话呢,我们要用真正用的应该用的是一个什么呀,应该用的是一个具体的实现类,所以你把它这个CTRL加H,你看一下它有很多实像类这里面。
13:02
理解吧,其中啊就有我们想要用的,比如说这里面呃,有这个什么past啊past,什么GGS,然后这里面就会有什么呀,比如说你的你之前用的是什么呀,叫做呃,我找找啊past。嗯。找一下啊,他在哪个里面放的,我一下给忘了啊,嗯,这个是past。呃,应该是这个啊,这不是那个bucket吗?对吧,然后这里面就会有啊,你看是有什么past,然后什么past,呃,这个什么什么。各种类型的啊past,然后它里面再会有什么past string,什么long terms,什么double terms。对吧,现在我们为什么我要去找这个,找这个什么term呢?因为我们在做分组的时候,你看一下我应该用的就是一个term,我是做了这个分组,那我将来取的时候呢,我应该要什么去取这个term的这个操作,对吧?所以说你看啊,这个地方我们正常应该返回的是一个term的一个aggreg,但是呢,我们现在用了一个比较大的类型,这个大的类型里面它就没有这个方法,所以说这个地方呀,我们就得按照你实际的一个情况,就是你到底是做了什么操作,然后呢,把它转成一个具体的类型,那我就不能这么去写了啊同学们,你怎么写你是拿不出来结果的,好吧,我把这给你说明白了啊,那怎么写呢?我把它注释掉。
14:24
注释掉以后我重新来写,好应该这么写啊,呃,我们这句话就不给他了,那我正常给上一个past。啊,Pass这个什么terms。Past。Past。然后呢吧,因为啊这个pass terms呢,它也是,呃,就是这个继承了啊,或者什么实现了这个terms,你就往上翻吧,它肯定是属于我这个aggregation的啊行,然后呢,我们正好这个方法呢,你看啊,他说你这个A啊,它只要是什么继承的这个obggggg的,它是一个什么呀。
15:01
设定了一个什么泛型的一个什么上限,对不对,只要你是小于等于它的这个类型都可以,那你看一下我现在给的这个帕特姆斯正好就是它的一个子类型,那我这地方是可以什么正常去写的,那这个东西给我反馈回来的应该就是这个past的一个terms吧,呃,别了啊,还是用这个名字吧,还是一个go啊,对吧,用它。好,那你拿到这个结果以后,接下来你看一下啊,我就可以拿它。直接什么区域get bucket,这就有了。看到了吧,呃,就是大的类型,它这个不好去拿,但这个小的类型我是什么比较好去拿的啊,OK,好,那我这个拿到以后的话接收回来,这就是我的那个bucket,那我拿到bucket以后呢,对它什么做一个迭代啊,但是它是一个有跳的一个集合,所以说呢,你现在去迭代的话呢,这个不太好迭代啊,那我们可以怎么去做呢?这个导一个skyla的什么集合,对吧,集合里面的一个转换啊叫javas,这个我之前应该用过哈,然后呢,这个buckets。
16:00
加as,好,再去做这个迭代加for。OK,那这个拿到了就是我们的每一个bucket啊,对吧,那你看这个bucket不就是它吗?就是我的每一个bucket吧,好,那我拿到以后呢,那我就可以去拿了啊拿什么呀,比如说先拿这个演员的名字啊,演员名字好怎么拿呢?8K奖get,演员名字是K,那就get key对吧,直接S去啊,这是我的act name好再拿什么这个平均分啊,平均分怎么拿呢?那就是8k.get一个叫做这又是一个聚合对不对。这个豆瓣school avg,这又是一个聚合,说你还要再去拿一个get obgggs好拿出来,呃,这又是一个obgggs啊,然后你再通过它呢去get,那这一次get的话,你看一下啊,我们又要给泛型了,这个我们做的什么,我们做的是一个叫做avg的一个操作啊,看一下是不是avg的一个操作呀,所以说啊,我们正常要把它转成一个叫做past avg。
17:06
能看到吧,它也是我这个aggregation的一个子类型啊,然后把名字传上,这个叫做什么豆瓣扣avg对吧,介绍回来这就是一个。豆瓣扣的一个past AG。好,那你拿到它以后,你注意啊,再通过什么,再通过它往出去get啊get谁呢?是不是get这个看结果啊,是不是get这个它的value就可以了呀,对吧,讲这个get value就可以了,对吧,你就把它拿出来了啊,这是我的那个平均分啊,找这个avgk,好那你看一下吧,演员的名字平均分都拿出来了,最后我们做一个打印吧哈,做一个打印就是,呃,叫什么叫这个actor。嗯。诶,咋不提示我呀。好来action name啊,然后呢,这个加上啊这个共好共什么,共参演了这个多少部电影啊,那这个刀看了也拿一下是不是。
18:10
对吧,刀count你拿一下吧,来平均分,然后这个是呃,参演的电影个数啊,电影电影这个电影个数对吧?好,那就拿一下吧,就是bucket点什么get这个好拿啊,这是一个do count do count OK,好,这是一个叫做movie count OK吧,共参演了,然后呢,Dollar加这个。啊。诶,这提示不太好啊。呃,Movie啊部电影。好,平均分,平均分为,然后呢,到了我们加上我们的avgk,这就完事了。看到了吧,啊,这就把最后结果他这个求出来了啊好行吧,那我们就来这个跑一把啊,看看这个结果对不对啊,Search by a JS来拿过来。
19:08
好,放到这儿跑一把啊。哪里错了,我看看啊呃啊,我这放错东西了啊诶对的呢呀啊,又放成大写的了呀。这个放这个变量哈,你不能放这个类型是吧。好看一下吧,跟我们这个查的结果对不对啊,你看海清呢,共演了一部电影,平均分是8.5对吧,这个张译呢也是啊8.5,然后这个张涵予的是8.25,然后就最后一个我没有没有截上哈,这里面是有的,你看这个爱D硅谷05:00对吧,跟这个结果是对应的。好吧,那这就说明什么,说明我们这个聚合查询啊也是。正确的。OK吧啊,这个就是会麻烦一些啊,就是呃,但是它没什么难度啊,你就正常按照你的这个DSL呢去做解析啊,你在写的时候呢,比如说你在查的时候也是按照这个DSL呢去这个转换的代码,然后你查完以后呢,这个结果呢,也是什么呀,按照这个DSL啊,他给你返回的结果,然后一点点往出去提取就可以。
20:17
好吧,去提取就完事了啊,OK,行,呃,那我们就说这么多了啊。
我来说两句