00:01
好,来吧,我们开始下午的内容啊呃,上午的话,我们,呃已经把这个就是基本的这个调用过程啊,都把这个写好了啊。对吧,就是现在我们要先做一个按照这个类别呢去做这个就是统计啊。好,我们的controller也写好了,然后这个呢也写好了。对吧,接下来什么到到我们这个map里面了啊,那我们在这个map里面的话呢,就是什么做这个具体的查询了。对吧。好,那我们在这个查的时候呢,需要给大家这个分析一下哈,呃,分析什么东西呢?啊,就现在我们的这个T啊,嗯,就这两个还好啊,就是你那个搜索的那个,就是搜索的那个关键词对不对。然后呢,这个是你的日期,关键是这个T啊,这个东西我们需要这个多说两句啊。呃,因为我们,呃,刚才我们在那做了这个请求啊。刚才我们正在做的这个效果,它是需要什么?发送两个请求的,一个是按照这个性别统计,一个是按照这个年龄去做统计。
01:05
对吧,那也就意味着啊,将来你这个传过来以后呢,呃,在我们这个代码中啊,我们正常应该获取到的是,嗯。在这啊,我这张获取到应该是两个,一个是edge,一个是这个真的对吧,那你这个的话没有做任何处理,你就开始往后传,然后呢,传到你的这个service中,Service的话呢,我目前也没有做处理,然后我就接着往后传,就传到了我的这个map里面,那么到了这个地方以后呢,我就得知道你这个T呢到底是谁。是吧,因为将来我们再去做这个统计的时候,比如说你是按照这个性别统计的,还是按照这个年龄统计的,那我得知道。OK吧,好,那这个它的也无所谓啊,反正它是一个字段,那为什么按照这个字段去做这个统计就行了啊,但现在有一个问题是这样的啊,大家看一下,呃,我们给他传过来的一个参数呢,是age或者是这个针的,但实际上在我们这个索引里面哈,来我们找一下在这个索引里面,比如说我们去查一下这个。这么样啊,这个查的是你个order的吧,同学们查这个order啊,然后呢,呃,三月29昨天跑的数据啊,就查他吧。
02:08
好,然后呢,下滑下这个search啊,大家来看啊,我在查的时候,我们查出的数据里面啊。他有这两个字段,但是人家这个字段的名字呢。不是A和真的。它叫这个USA age和这个USA。那也就意味着啊,其实我们在这个地方呢,其实是不能为什么直接去,呃,拿上你这个传过来这个字段的去做这个查询的,对吧,因为你传过来以后呢,它是一个age,或者是一个真的。对吧,但实际上的话,我们真正要去查的时候呢,应该是一个user_edge然后这个是一个什么user下划线增的对吧,这才是我这个索引中的字段啊,所以我们应该什么呀,应该先把你的这个A值或者这个针呢,处理成什么对应的这个字段。能理解吧啊呃,那么这个事情的话呢,其实对于我们的这个map来讲啊,他不应该负责这个事儿,他就是非常单纯的啊,按照什么你传过来这个参数呢,去做这个查询。
03:04
所以说呢,这个事情呢,其实你就可以把它归到我这个业务处理中了。OK吧,所以说呢,我们需要什么在这个业务处理中呢,把这个先给它处理一下啊,那我们就回到我们这个service里面。那来到这个service里面以后呢,你这个T呢,你就不能够什么再接着往后去传了。明白吧,那我们应该怎么传呢?应该这么去传看好了啊,呃,我们写上一个方法啊,这个方法的话呢,就是呃,把你的这个type变成一个字段对吧,变成这个字段的名字啊好,你把这个T呢给我传过来,那么传过来以后呢,这里面我就判断了啊,如果说你这个呃,Age,讲这个equals啊,是你这个T,如果你传的是个age,那我给你return的是一个叫做USER3AGE对吧?好,然后你这个else if,如果说你是一个ger,讲这个equals,比如说这个T,好,那我给你return的是一个user ger啊,User这个ger。
04:00
能还明白吧,好,那当然你可以想再去接着写,如果说你还有别的情况,你接着写啊,那这个其他情况的话呢,呃,其他情况我就没有,那我就转成一个空的了啊,就让这个代码能够正常执行就完事了啊,反正现在我们的两种情况我都是写出来的。看明白了吧,好,所以说我们再去传的时候,这个地方呢,我们就不能传它了,我们应该什么传什么type to fail,然后把T传进去,就是传一个你做完转换以后的,把它转成一个什么,就是一个字段了,理解吧,好,那你这个传过来以后呢,我们在我们这个map里面啊,我们就呃不适合再叫成这个T了啊,我们应该把它叫成一个什么field,对不对啊,造成一个field比较合适啊,理解了吧。好,那这个地方你改了的话,那我看一下啊,我的那个呃,Map的这个接口中,我们把这个名字也改一改吧,啊,这样的话你会看到会更加的,呃,就是。诶更加的什么正确一些好吧,就是先把这个事情呢做一个处理啊行,那这个处理好以后的话,接下来我们就可以做这个查询了啊,接下来我们就查一下,呃,这两个查询差不多啊,就是你这个分组的字段不一样啊,那我们就基于这个A或者什么基于这个真的来去写啊,都可以来先写DSL啊。
05:11
好,过来以后,这是我们这个查询的过程,那您看一下啊,我们是想查询你这个,呃,统计对吧,那你要统计的话,那肯定就是AJS。对吧,A就JS啊,呃,我们先不着急写它吧,先不着急写它,我们先写另外一个,你看看哈,人家还传了一个这个item name,这个item name什么意思呢?你看看哈,在我们这个页面中呢,我是要给你传一个关键字的,比如说这个华为手机或者小米手机,那你看你为什么拿上这个东西,是不是去做一个数据的检索的呀。对吧,所以说呢,我们需要什么,先把它体现出来啊,那这个肯定是做一个,呃,就是你的SQ name啊,就是你的这个这个商品的这个名字啊,所以说我们在写的时候呢,应该是一个query,好query里面的话,我们做的是一个match的操作。对吧,Match的话呢,我们写的是一个,就是比如说呃,你的SQ。SQ name对吧,后面写什么呢?后面的话正常我们就把你这个字段写上啊,那现在我们写DSL的话,我就随便写一个,我就写个小米手机,小米手机就可以了。
06:11
对吧,我就这么去查啊,来我们先把这个查一下啊,这里面其实还会有一有一些问题啊。好,这是我查到的结果,这个结果里面的话,你看一下啊,首先第一个结果你就发现它不对劲了。你查的是小米手机,它居然出现了这个小米电视。对吧,然后再往后看啊。呃,这个倒对的啊,这个没问题,这个没问题。呃,这也没问题。这也没问题啊。这个都可以。好,都可以。呃,诶,你看这个。居然还出现了什么这个Apple就是一个苹果手机。对吧?啊,当然了,大家可能在想,诶,这应该是正常现象啊,你这个小米手机,你去做这个分次匹配,那你分成什么小米和手机,那我这个小米电视我是能够匹配小米的,那我这个Apple手机,我是可以怎么匹配手机的。对吧,这个查询肯定是正确的啊,正确的一个分支查询,但其实现在我们是想要这个效果吗?同学们,我们不想要这个效果,我们现在就想把小米手机相关的信息给他调出来,你这个东西你统计进去,你这个不对吧,我想统计一下这个小米手机的一个销量,你把这个小米电视的啊,小米平板的,还有什么这个苹果手机的,华为手机的,你都统计进去了。
07:19
这肯定是不对的。OK吧,所以说这个地方我应该怎么写啊,我们应该这么去写。我们希望他啊,小米手机呢,这肯定是我的分词匹配,但是你在做分词匹配的时候,这两个字要什么同时出现啊,这两个字要什么同时出现,就是你光有手机不行,你还得有小米,你光有小米不行,你还得有手机。这样你就可以把什么苹果手机、华为手机、小米电视给它过滤掉。那这个怎么写呢?我们就说一下啊,你可以把它这个去掉,去掉以后呢,后面我们写个大括号啊,这里面我可以写个query,呃,我看看啊,诶写个query啊,这个query的话呢,就是表示你要搜索什么,我搜索的是一个小米手机啊,那么将来这个东西呢,会分词,分词以后的话就是小米和手机,那我们可以写一个operator就操作。
08:02
呃,写个操作,这个操作的话呢,它里面就会有一个关系,你是一个且的关系还是一个或的关系,如果是一个且的关系就说白了,这两个东西都得出现,好你看一下啊,刚才我们查的时候,我们总共查到的是呃,21条数据啊,这一次我们再来查。七条数据。对吧,这条数据来你看一下啊,这里面。小米手机对吧,小米手机你就看吧,肯定都是这个跟小米手机相关的,就不可能再出现别的东西了。好吧,所以这个地方你要注意一下的啊,OK啊行,那这个写出来以后呢,这还不是我们最终想要的效果啊,我们想要的是按照你的这个年龄段的去做一个,呃,按照这个年龄段哈,呃按或者什么按照你的这个性别呢,去做一个,呃,这个分组统计的对吧?所以接下来我们再去写这个HJS,好,那比如说呢,我们先写一个,嗯,按照什么呀,按照这个性别吧,好给我拜什么拜这个真的。那行吧,那类型的话呢,就是term斯呗,肯定是term斯了啊,这里面写的就是你的这个优侧针,好,那如果你是性别的话,这得分两个组就可以了。
09:06
对吧,性别的话分两个组就可以了啊行,你这个分好组以后呢,我们求的是呃,你的男和女啊,这个订单的一个什么总额,对吧,所以说我们需要在这个。呃,在这个格物拜里面啊,然后再去写一个HJS,这个的话,我们求的是什么呀?求的是一个sum操作啊,那我们就叫做呃叫。Total amount对吧,可以吧,知道这个total amount就是总金额啊,然后这是一个sum操作,那你sum的时候你通过哪个字段呢?看一下啊,这里面我们是的明细啊,明细的话我们应该通过照切分以后的这个total amount通过这个字段来去做啊split。Total amount split total amount。能看到吧。好,我们需要什么,通过它来去做啊,行来这样的话,我们再来去查一下啊,OK,这个查出来以后呢,呃,明细数据我们其实就不要了啊,目前我们是不要明细的,对不对。
10:01
对吧,目前我们是比较明细的明细,我们是单独去查的啊,单独去查的。好,然后呢,这个里面我们主要往下翻啊,这就是我们最后统计好的结果,你看啊,这个呃,女的啊有多少,然后这个男的有多少。对吧,好,那如果说你不要明细数据的话呢,你可以再加上一个,就是那个size就是零就可以了,就不要明细呗,对吧,这个时候你再来查一下啊好,你看看吧,就只有这个结果了,对吧?好,那这是你的一个通过什么,通过你的真的查的,那比如说呢,我们再去把它复制一个。我们想通过年龄查,通过年龄查的话,这里面我们只需要改一个东西,就是把这个改一下,改成这个us的叫age啊,那么这样的话,就可以把你的每一个年龄段,他所成交的金额都给你查出来,你看一下啊,就是27岁的有多少,然后呢,16岁的有多少,对吧,那正好我的数据里面可能就是这两个年龄段,这就这两个年龄啊,那最后我们的结果呢,并不是想要说这个每个年龄,我们想到是一个年龄段。
11:00
那就很简单了呀,你把这个数据处理成一个年龄段不就好了吗?对吧,你再单独去把这个结果处理一下不就好了吗。啊,所以说呢,对于我们的这个当前要写的这个查询来讲,我们其实就可以把这两个查询呢,给它组合成一起,反正你最后查到的结果都是这个这个结果。对吧,都是一个K,然后呢,一个Y6,一个K一个Y6。能理解吧,好,那我就把它统一写了啊。行,那我们就拿过来这个去写写啊,稍微小一点。嗯。这是age,那我拿这个吧。好吧,把它拿过来啊,我们来去写一下。好,放到这儿来,呃,结果结果的话我也拿一下啊,我把它再查一下,好,这是我的结果啊,结果的话我也拿过来。行,我们就可以开始写了啊同学们,呃,那我们回到我们这个代码中啊,开始写吧,那首先你还得有一个索引,对吧,那这个索引的话,我们再定一下啊呃,哎呀,这个是这个我们改个名字吧,叫index name叫dau好吧。
12:03
这样啊。呃。我看看啊,呃,改个名字。好,改成这个叫做。Dau啊,OK,这样整体改啊,这样的话,你看一下我们所有用到它的地方就会跟着都改了啊。展开改了吧。对吧,你整体改啊,他就会都给你改掉啊,你看这里面这个这个改了,然后呢,呃,这里面也改了啊,是不是这个都改了啊行,然后呢,接下来我们再去定外定义另外一个,比如说嗯。来我们叫什么呀,我们叫做好,当然你可以把它写的分开啊,比如说我这个再去写一个什么service,再去写个controlrler也可以啊,我就把它写到一起了啊,这个是我们这个,呃,支付就是这个交易的分析啊,交易的话我们就叫做嗯,就叫order,把订单的好吧,Index name perfect啊好准备啊,然后呢,叫这个order,然后下划线,1018,然后再来个下划线,对吧?好,那这个有了以后呢,接下来啊,你进来以后你看了哈,进来以后首先的话,你干嘛呀,先把这个索引给它搞定啊,Index name等于什么呀?叫order的这个加上一个呃,加上我的这个data就可以对吧,双引就搞定了,那搞定以后下面就写吧,写查询啊,就是ES client加search。
13:37
好,这里面我们需要一个search request,那我们用上一个search request对吧?好,这是我的search request啊,然后把它们拿过来放进去,好,然后呢,Request default啊OK,然后呢,把这个索引啊,直接什么扔进来好OK,这个有异常的话,我们给他这个处理一下啊还是呃,还是通过我们这个拆开始来处理啊,诶错了啊好拆开始处理,那我处理的方式的话都是一样子的啊把这个再来复制一下。
14:08
对啊,我的处理方式都是一样的啊。好,这样就可以了,OK,行,那我们接着写吧,你看啊,这里面查的话,我们需要有一个叫做嗯,就是search request呀,Source,我们需要一个search source build,对吧,用上一个search source build。好,然后呢,你把它。你把它放进来。OK,接下来挨个写啊呃,首先我们先写一个这个size啊,就是零啊这个什么,我们不需要明细啊,好,来写一下啊,不需要明细啊。OK,那这个切好以后再来往后啊,再往后的话就是。呃,先写这个查询吧,好吧,我们有一个query啊好,有一个query。嗯,诶。
15:00
好,有一个query,然后呢,还有一个就是聚合,聚合的话我们有这个分组啊,有分组,分完组以后的话,我们有这个叫做呃,Sum的操作,对吧?好,先写query啊,Query的话就是such build,呃,它里面有这个什么query,那你query的话,我们需要一个query build啊,这个query的话,它是一个嗯,Match的对不对,那我们写一个啊,就是query build斯啊,点match match query。好,那你卖出的时候,你要写一个名字啊,叫SQ name对吧,那我们写个呃,SKU name对吧?好,那后面呃,再来写啊,这里面还得有一个什么呀,叫做object text,这就是什么呀,你这个匹配的那个值,那这个值的话呢,应该就是我们传过来这个item name。对吧,这就是你在页面中写的那个什么小米手机什么的啊呃,然后呢,它还有一个operator,那我写个operator,这个operator的话呢,它里面应该是一个operator的一个按操作。对不对,这样就可以了啊,把它这个接收回来,好,这是我们的match build OK,那你就把这个match build给他什么放进来,这就搞定了。
16:07
对吧,这个就搞定了啊好,搞定以后下面就是聚合,聚合的话呢,就是such source build第叫aggregation,好,这里面我们要的是一个聚合的build,对吧,那我们就aggreg build斯点,呃,先来一个term啊,Term的话呢,这里面写的是你的名字啊,名字我们就叫做group by by什么呀。加上一个我们的field的吧,对吧,你是按照年龄还是性别来去分组的,那我就写上他的名字啊好分组的话呢,这里面我们要写的是你的field,你的字段,字段就是我们的这个fair的字段,对吧?再去写一个size,好,这个size目前对于我们的这个性别分组的话呢,我们分两个组就可以对吧?但对于你的这个年龄段分组的话呢,那你年龄的话呢,我们就得多写个,比如说你这个零到100岁是吧?啊,你就大概确定一个范围啊,比说我就写个100个得了啊,这样的话我就什么通用了。理解吧,我就通用了啊,既可以应对你的年龄,也可以应对你的性别啊,行,把这个写好以后呢介绍回来,这是我的term的aggreg build。
17:07
好,这个写好以后把它放进去。但是还没完啊,这里面我们还得有一个sum,你这是在做好分组了呀,对不对,你刚做了分组,那你还得把这个sum写出来,Sum的话就是我们的term的aggreg build里面有一个叫做sub aggregation。对吧,这里面我们再去写上一个啊,叫aggsion build斯点它是一个some,好some的时候呢,你要你要取名字的啊,我们就直接这个就写死了啊total amount可以吧,然后呢,再去写什么,写这个felt felt的话,我们写的是。写的哪个fair呀,就是我们这个split total amount啊,这个我就不写了啊,我怕写错。复制一下。搞定了吧,好,那搞定以后呢,把它接收回来啊好,这是我们的somes aggre build,然后呢,你再把这个东西呢,放到它里面,诶这个整体就把它套起来了。
18:01
对吧,那这个套起来以后呢,下面我们就是一个查询,那我查出来以后呢,接下来处理你的结果集呗,那结果机怎么处理呢?比如说我们现在啊,就把它什么整体封装成一个map。对吧,你看正好是一个key一个value,一个key一个value啊来我们处理一下search source search这个response点啊,先get这个aggreg啊好,返回一个aggregation啊,然后呢,你再去什么做一个get get的时候呢,我们写的是名字啊,那就是group by by什么呢?还是啊,加上你的这个felt,对吧,你上面取了什么名字,那我下面就使用什么名字啊。好,然后呢接收回来,但这个接收回来以后呢,这个东西还是不好用啊,我们就同意把它处理成一个past。Pass这个特姆斯啊,处理下它啊,这个是好用的啊好,然后呢,再通过这个pass特姆斯啊呃,再去什么get这个bucket对吧,这都写过很多次的代码了啊行,然后呢,我们再去对这个bucket呢做一个迭代。
19:00
好迭代的时候呢,呃,从它里面啊,你看这个bucket。好bucket我们去get什么呀,这个就什么直接get key就可以了哈,Get你的key string啊就可以了,这是我们的key对吧?然后呢,再次我们通过bucket,然后你看啊,你再获取什么东西呢?你再获取的应该就是呃,这个这个叫什么叫做又一个聚合了,对吧?那我什么再去get这个obgggggations啊,又是一个obligations啊,然后呢,再通过它呢,再去做一个get,那这个get的话,我们上面写是写死的就是它。好,那你把它拿过来,拿过来以后呢,这个接收回来,好,这个的话应该是一个past some,对不对,我们就直接写了啊past诶。好,Past这个some看到了吧,就是past some好,再通过这个past some,我们去从它里面拿东西,拿一个value就可以了啊,这样这个get value好就把它拿出来,这就是我这个聚合以后的结果啊,这就是那个突出amount好吧,行,那你看我把这个处理好以后呢,那我最后啊,你看这是一个KV,这是一个KV,那我将来会有很多个KV,你性别的只有两个,但是年龄的就会很多啊,所以我们整体把它处理成一个,呃,处理成这个结构对不对?
20:15
对吧,那我就这样了啊,我们怎么做呢?我去写一下啊,我们去扭上一个a list好,你处理成map也行啊呃,不过我们已经约定好了,处理成这个结构,那就什么处理成它了啊,这是我的这个results好,然后呢,我们怎么写呢?你看了哈,到了这里面以后,我们就可以直接什么results加爱爱的什么东西呢。又上一个name value,那你在new的时候就把你的key放进去,把你的这个total amount放进去,这不就把结构拿回来了吗?能看明白吧,这就把结果拿回来了啊。好呃,那这个地方我们有了以后呢,最后再去return啊,Return一下这个result,那如果说你抛异常了,我也去return这个result,就相相当于什么,它里面没有东西。
21:02
对吧,直接把它写好了啊好,这个写好以后的话,我们可以什么先去做一个简单的测试啊同学们来,这个怎么测呢,我就。自己写慢方法来测了啊,我们写一个慢方法来测一下。好测一下啊,我就测一下这个,呃,我看看啊。呃,诶已经有了是吧。好,已经有了啊,那我就拿过来吧,放到上面吧啊,上面这个好看一点啊,来放到这我来去测一下啊,行,这是我测的那个日期的那个啊,这个就不不管它了啊,我们重新来测,那我就什么直接调这个方法呗,对吧,直接调这个方法啊呃,那我调方法的话还得用个对象啊,要不这个方法不太好调啊呃,我先选择静态的试试呢。对吧,呃,写成静态的好像不行啊,对,还得改别的啊,那我就用个对象得了啊,呃,来用上一个这个search。呃,又上一个当前的对象啊,Publisher这个。
22:03
好,就叫map吧,然后呢,Map我再去调这个方法就可以了啊,Search这个它就可以了,然后呢,这个的话我就写个小米手机吧,好吧,就写个小米手机,我先写死啊,后面这个日期的话,我就写个2022,然后呢,杠零三杠二九或者什么杠三零都可以啊,刚刚我们查的是二九对吧?好,那我就杠二九吧,然后后面这个费的话,我就先写个什么user age。对吧,好直接什么巨大打印了啊,看看他给我返反应,反应返回的结果是什么啊让一下。哎哟,这样撤还撤不了不行啊。这会报错啊,因为这个对象这个是需要由你的BOO来注入进来的啊,我们这么写的话,它这个没有对象啊,对吧,空指针的你看谁空了呀。这个空了。啊,这辆车还不行,哎哟,麻烦,呃,那行吧,那我不测了吧,那我不测了啊。就是你还得自己去创建对象,因为这个这种写法是需要你的这个boot给他装配进来的啊,我们现在自己写慢方法不行啊,呃,那不测了啊不测了。
23:06
不测了啊,同学们,我们直接返回结果吧。好吧,直接返回结果看啊行呃,那我们把这个写好了,写好以后的话,我们就直接把结果返回了,返回来的话你看一下啊,我们来到这。呃,你的service里面,我们就直接把这个结果还是给他往回返回啊,一直返回到我们的这个controller里面。呃,返回到我们这个CTRL里面以后看一下啊,返回到这以后,我们就把这个结果直接给他扔回去了,好,那我们就什么直接重启吧,重启以后我们什么通过这个接口来测了啊。对吧,直接通过接口来测吧,啊,要不你你那样写的话比较麻烦啊。嗯,诶。争取一下啊。好,重启以后呢,我们就可以去发送这个请求了啊,过来过来以后就不发这个请求了啊,我们发的是发的是这个请求啊,就把这个拿过来好把它这个替换一下啊,OK,然后这个我们改一下,这个叫0329啊杠29OK,比如说我先传一个真的啊,你看一下走。
24:10
呃,诶,没结果啊。嗯,没结果吗?这个是02021啊202啊走。好看一下吧,这个结果是可以查得到的啊,什么24892,然后呢,6894,你看我们结果一样不一样啊,一样的吧。对吧,好,那比如说呢,我把它换了,我换成一个什么age了,走你看一下这个27岁,你看啊,这个27岁有多少,然后呢,16岁有多少,然后20岁有多少。南方还明白啊啊,刚才是这样哈,刚刚这里面没有看到结果,是因为我这个分组太少了是吧,你看我查这个年龄的时候啊,刚刚忘了这个事了啊,你查这个呃,年龄的时候,我这个只有两个结果,对不对,那是因为我这个分组太少了,比如说你写上100个分组啊,这就多了啊。对吧,这个多了吧。是不是好,那现在我也能够查出来啊,你看一下这个结果对不对呢?这个是比如说这个27岁的13297对应一下啊。
25:03
27岁的13297对的吧。啊,这是没问题的啊,行,那说明我们的这个查询写的是没啥问题的,我们是正常正常可以把数据查出来的。OK吧,好,但是你这个症状查出来以后呢,现在还不能用哈,为什么不能用呢?大家看一下。人家要求的结果是这个结果,而你的结果是这个结果。来,我查这个真的啊。好,走一下。对吧,你来看一下有什么不一样哈,人家是要求这个name是男,然后呢,Y6是一个数字对吧,Name是女,VALUE64个数,你现在是个MF,这个不能用吧。对吧,这很明显不能用啊,然后还有一个就是你看了啊,人家要求是年龄段,但是如果说你要查年龄的话,你不是一个年龄段,你是一个具体的年龄。对吧,这也不能用,所以说我们还要怎么对这个结果呢,再次怎么做一个什么处理。好吧,来,呃,那我们先写到这啊。
我来说两句