00:00
那前面我们分析了一下,我们查询要用的DSL,它呢有非常多的内容,接下来我们就将它们转化为代码,首先我们来考虑页面呢,会发送请求给list HTML,然后呢,我们在设置power里边接收到了所有请求参数,然后我们调用service来进行检索处理,那么就在service里边我们就要做这些事情,那这个DSL的语句的。内容呢有非常多,当然我们整个要使用ES检索,按照以前我们的单元测试,我们需要注入一个叫。Rest high level client,好,我们在service里边,我们先来注入它,我要用它来进行真正的检索功能,那注入它以后呢,我们接下来就希望它能帮我们来执行检索,它呢有一个方法就叫search,它来进行搜索,那搜索呢,我们要传一个search request和我们这个设置项,还是拿到我们以前的代码,那search request我们得自己构建,设置项呢,我们都统一抽取了,把这个设置项先复制来,来放到我们的service这一块,那接下来我们需要一个search request,好,那在这来先来构建一个search request。
01:13
就在下边search request search request,又一个search request先创建出来,那们想要检索呢,就要用我们的客户端来执行我们设置request的请求,那他执行完了以后,给我们来返回结果,好,我们现在让他返回结果,那这就会有一个响应,而这个请求呢,肯定会有异常之类的surround的with字TRY看好,那么整个业务逻辑呢,就应该是这个样子,我们第一步首先来准备我们的请求,准备检索请求,然后呢,接下来我们第二步来执行检索请求,执行我们的检索请求,然后接下来第三步,这是我们执行检索以后呢,我们拿到了响应数据,接下来我们第三步我们就要分析响应数据,并且封装成我们指定的格式,第三步来分析响应数据。
02:07
封装成我们需要的格式,那么最终返回的就是这个search result,好,我们现在这来准备一个search result,那就等于,那然后呢,我们最终希望返回的是它,那检索请求的内容呢,有非常多,所以我们准备检索请求,我们要构建这么复杂的DSL,肯定呢方法很长,那我就来准备上一个方法,比如我们就叫build search result,我们就叫构建我们的检索请求,我们的request,好,我们来构建我们的检索请求。那这个检索请求呢,我们就希望能有一个方法,能直接帮我们来返回这个检索请求,那以后就用它就行了,好我们来创建出我们这个私有方法,好创建出来,那这个方法的作用就是帮我们来做我们第一步的事情,准备我们的检索请求,那最终呢,帮我们来返回我们这个。
03:06
Search result search request。那我们前所请求,假设在这都准备好以后,我们最终执行完,我们也希望能有一个方法,我们就叫build search result,诶我们这个呢,是来构建我们的检索结果,根据我们最终执行来的我们整个响应数据,然后呢给我们封装成我们指定要用的这个result数据。我们希望呢,也有这么一个方法创建出来,这些方法呢,都是我们方法体内部的一个私有方法,好我们先来return呢,它的作用呢,就是给我们构建结果数据,构建咱们这个结果数据。来,我们先来准备我们的请求,我们的大题呢,就是这几个步骤,只要准备好我们的请求,我们执行完以后,把结果呢一返回就行了,那么再来考虑我们这个请求准备需要哪些东西,首先我们整个检索期间,我们要用到这么多的功能,我把这个呢复制过来,所以我们准备请求要考虑这么多的功能,而且呢,我们准备的最终是一个DSL语句,就跟我们以前做的这个单元测试一样,我们所有的检索语句构建,我们全部要从一个search source builder开始,然后将这些构建来的所有东西,我们这有一个s build,它构建完了以后。
04:31
我们给search request里边一放就行了,所以我们来看一下我们构建的这个检索请求就应该长这个样子,来,我们来new一个search request,那在这个request里边可以来传入我们一些参数,比如我们要用哪个索引,再比如我们构建BSL语句用的哪个search source build好,我就呢指定成这个样子,我用它这个构造器好,那么这个构造器呢,现在我需要一个索引,这个索引呢是一个string的数组,那我就来拗一个string的数组。
05:09
而且这个数组里边呢,有一个确定的元素,我们这个索引用的都是我们封装起来的ES constant,我们的商品索引就是它,然后我们source build,我们也来准备一个search source build,我们就叫search source build,等于new一个search source build,这个build呢是帮我们来构建DSL语句的。我们把这个build传到这儿,好,我们把这个传到这,我们的整个检索请求这个对象我们就得到了,得到以后呢,把它一返回就行了,但是我们所有检索请求的构建都要通过这个source build来做,所以呢,这个source build就要做以下的内容。第一个我们先来看模糊匹配以及过滤,这都是我们查询部分的,包括第二个。
06:05
我们来看排序、分页高亮、聚合分析好,我们把这个排序、分页高亮我们放在一起,这个功能我们也要做好,包括我们的聚合分析,我们都要用这个search Bo的构建出我们DSL语句。那这些语句怎么构建,我们先来参照我们的BSL的杰森,好,我们先要构建一个查询,好这个查询里边是一个布尔查询,所以我们用source build,好我们拿过来,我们先来准备一个,这是我们所有的查询条件,诶我们所有的查询包含我们这些search source build,好我们要进行查询,那么就来指定有一个叫quary query里边呢要传一个quary build。所有我们所有的查询我们都放在这个corry builder里边,而且我们要用这个corry builders,因为这个builders我们说这是一个工具类,它帮我们来构建出quary builder,而我们DSL里边,我们首先是一个布尔quary,所以我们用builds,我先来构建一个布尔quary,那这个布尔quary呢,就是我们整个quary build构建的内容,我们把这个quary build放进这个quary里边。
07:19
好,相当于我们给source build里边我们先来构建了第一个quary qua里边是布尔,那布尔里边呢又比较复杂,我们来说一下,它有两个must和菲特,所以呢,我们根据这个布尔cor rebu,它的这个布尔cor瑞,我们来继续构建,好,这是我们做的第一步。构建了这个布尔括瑞,这个布尔阔瑞里边呢,组合了多个括瑞,所以呢,我们接下来继续一点,一,它组合的第一个quary,这是我们的mask条件好我们来mask,而且我们这个mask呢,它是来做我们模糊匹配的,我们在这儿匹配SK的title是华为的,但是我们想要做这个条件,那我们就应该是我们传的这个请求参数里边,我们传了我们检索的这个关键字才行。
08:12
所以我们把这个方法呢,签名改一下,那在构建这个请求的时候,一定要根据请求参数传的这些数据我们来做,所以我们的构建request请求放在这儿,好,那我们接下来要构建这个mask,我们先来判断,如果我们传了,那我们就来构建,那么就来写一个叫string uus.is empty,那先来判断它不为空,那就是P里边如果给我们传了这个keyword。它不是空,那么就来构建,它必须来进行模糊查询的。好,我们现在做第一个must的模糊匹配。那做过的我就从这儿剔除掉,好must的模糊匹配我们就在这儿来做,我们相当于是给这个布尔qua瑞里边我们放的东西,好,我们把它呢就叫布尔qua瑞比较好看一点,好布尔qua瑞,那给布尔瑞里边放第一个MAS的条件,所以呢我们来点一个,那接下来就得有一个叫mask,而mask里边所有的内容还是用corre builder来做的,所以呢,我们直接使用这个builds来构建,我们来看mask里边第一个就是match,我们来进行匹配的,那么就quary builds里边来构建一个match query我们来进行匹配,匹配什么呢?按照名字和值进行匹配,那这个名字就是我们相当于按照这个属性名SQ title,而它的值是什么呢?如果我们传过来了,那肯定就是我们页面给我们带的这个keyword值,这个相当于我们给布尔cor里边放了一个match。
09:52
那接下来我们这个就完了,接下来1.2来看我们的这个布尔qua瑞里边,更复杂的都在filter里边,我们的MAS就完了,它呢是我们携带了我们的查询条件才有。接下来我们来看filter,这个filter呢又分为很多层,我们一层一层来做好,把这个呢都缩一下,那先来做第一层,我们按照三级分类的ID来查,所以我们接下来又要构建一个filter,那现在所有的查询在布尔里边,我们除了构建我们这个must外。
10:28
我们布尔的这个quary里边,我们还要构建一个filter,好,我们这个filter里边呢,有非常多的内容,所以我们这个布尔quary我们先来整一个filter,而这个filter里边还是要传入我们很多的条件,我们来看那filter里边第一个就是如果我们带了三级分类,按三级分类查,所以我们还继续来判断我们string us,如果页面给我们its empty。我们per点一个get,我们带了三级分类的ID,相当于我们想要按照三级分类查的,如果页面带了,而且这个三级分类ID呢,由于是它是一个浪,所以我们不用用string u来判断,那么就来判断它不等于空,那相当于页面带了三级分类的ID,那么就要有一个我们三级分类的ID查询条件,那这个查询条件呢,我们相当于还是要放到这个filter里边和filter。
11:26
我们的第一个条件,它里边呢要传一个quary build,我们来看一下这个filter,我们要一个有参构造器传quary build,好,我们就来用query build,我们用query builders来进行构建就行了,我们的第一个过滤条件。我们来构建,构建什么呢?我们现在是按照三级分类的ID来构建的,所以我们corry build点一个,我们来写一个term query,那三级分类的ID我们是一个term查询,所以我们按照它的ID cat log ID等于我们指定的值,好,Term quary里边name是它值呢,那就是我们指定的页面传递过来的三级分类的ID值。
12:09
相当于我们来做了第一个filter,按照按照。三级分类ID查询的,然后呢,接下来我们来再做第二个filter,还是我们1.2的内容,我们不玩的filter,那我们除了按照三级分类的来查,我们还可能会按照好我们把这个查过的就放掉,然后呢,还可能按照品牌的ID,而品牌的ID呢有多个,所以我们在这儿还得继续判断,如果页面传来的品牌ID有值点一个来get,那页面所有的品牌参数都在这里边封装着,它不等于空。并且呢,PA size是大于零的,点一个这个我们来取它的length长度,我们就来叫size,首先得get brand ID点一个size,它这个size呢是大于零的,那说明我们带了品牌ID查询,那么就给这个布尔quary里边,它的filter里边我们来看布尔qua瑞的filter里边,我们再构建一个查询条件,所以呢,我们相当于拿到这个布尔qua瑞们给它呢再来整一个过滤条件,这个条件呢,我们还是拿corry builds来构建出来就行了,而这个条件呢,我们用的是terms,所以我们品牌ID的查询,我们用terms来构建一个terms。
13:35
来找到term quary,而且我们传的是一个浪数据所,我们来找term cor来能传入浪类型的,来内幕呢,那就是我们按照品牌的ID,好我们把这个name复制过来,相当于这个属性查询的,然后呢,值,那就是我们得到的所有品牌ID的值,好我们把它拿过来,这是我们又构建了一个按照品牌ID。
14:04
品牌ID进行查询的,那接下来我们来继续,那除了这个品牌ID,好,我们把品牌ID做完了,我们再来做一下,还有我们这个按照属性来进行查询的,这个属性呢比较复杂,我们先放在这儿,把其他的来做一下,好接下来我们把这个1.2的属性放到这1.2,按照所有指定的属性,所有指定的属性进行查询,那接下来我们再来看其他的,我们先下来分析,属性先放在这儿,我们来看这个按照我们是否拥有库存来进行查询的,所以我们接下来继续,我们就来1.2filter filter里边呢,又要按照库存。是否要进行查询,所以我们还是来判断,如果我们页面传来的search p,那默认要查库存的话,那页面呢,会给我们传入零或一这两个条件,零代表我们查无库存的,一代表查有库存的,所以页面传的不是出false,传的是零,一无库存还是我们的这个有库存。
15:19
而且呢,我们可以给一个默认值,默认呢都是一查询的是有库存的内容,所以我们就在这儿。来进行判断,我们也不用进行判断了,它不是零就是一,那么就来构建库存,不尔qua瑞,我们来filter,库存呢,相当于是filter里边的又一个term条件,我们是hands字to是true还是false?好,我们就用corry builders来构建它的term quary,我们来准备一个term quary to quary呢,有一个叫handsto,由如我们要传入true false,所以呢,我们拿到页面给我们传递过来的是否有库存,Get hands stock。我们就让他判断一个等等一,那等等一的话,那就是处,他在这儿就是处,如果不等一,那就是false,查无库存的,我们相当于把它呢按照库存查询,我们就构建出来了,我们来继续,那除了按照库存,我们在这儿呢,还会传入,我们可能会传一个价格区间,而价格区间这一块呢,就更麻烦了,所以我们先来先写上它,我们来按照价格区间来进行检索,我把这个复制过来,我们按照价格区间,价格区间因为这个价格区间我们按照页面的约定,我们可能会这么传,我们传一个一杠500,那就是大于它,小于它,传一个杠500,那就是小于它,传一个500杠,那就是大于它。所以我们有多种不同的情况,所以呢,我们就来看我们页面有没有给我们传SQ price按照价格区间查询的这个参数,好,我们在这儿呢,先来判断它有没有传if。如果页。
17:00
面给我们传了string u还是string YouTube点一个is empty里边页面如果给我们传了SQ price,这是一个检索条件,我们是封装成string的,如果它传了,它不是空,相当于页面传了价格区间,而且价格区间呢是我们这种格式,我们必须呢是这种格式的,那我们就来进行查询。好,我们就来进行判断,由于我们是价格区间,我们最终组装的是一个range查询,有GTULT,所以我们先来看一下我们这种方式,我们该怎么进行封装好,我们这种方式呢,就长成这样,我们先放在这儿,然后呢,我们还是给这个布尔qua瑞里边,给他的filter里边来构建条件的好,我们还是用RY builds里边点一个我们以前的是特,现在要用ranch好,那现在相当于要用一个range query,它里边传入一个name name,那直接就是SQ price,但这个RA呢,条件又比较复杂,把这个呢单独挑出来好,这是我们的range quary,我把这个range拿过来,我把这个range quary最终传到我们菲里边,但这个range呢,到底要评gttee还是不平,我要根据不同的条件,什么条件呢?我们先得把这个SQ price好,我们把这个东西我们来拿来。
18:25
点一个split,我们要进行分割,因为我们每一个中间我们给它传了一个小短横杠,我们先按照它来进行分割,那如果它来进行分割得出一个。数组,那这个数组呢,可能就有这么几种情况,第一个按照它分割得到两个值,那这就是一个区间,所以呢,我来A,我们来判断S,点一个length,如果它等等于二,那这就是一个区间区间,那这个区间呢,我们就应该给range里边拼成这个条件,点一个GTE大于什么大于等于什么大于等于我们当然是S里边的第一个值零,然后呢,再来拼上LTE,我们看能不能链式调用,诶可以,那再点一个LTE等于我们S1相当于我们拼的这个大于等于前面的和小于等于后边的,这时我们如果是一个区间,那否则的话,否则LF,如果它的length等于一,等等一,那说明呢,它就是我们大于的或者小于的,所以这种情况呢,我们还得判断,我们继续来判断。
19:38
如果说我们这个S,它现在是一不是平区间了,如果它start位置,比如说以我们短横杠开始的,那就是小雨的,哎,那我们就不在这来判断S了,我们得判断我们的整个SQ price这个字符串,如果呢,它点一个start位置,如果它是以我们这个短横杠开始的,那说明它是这种情况,诶,它是这种情况,那我们只凭一个LTE小于我们这个,所以我们的range chry应该是这样,Range quary点一个LTE来指定一个LTELTE的值,由于这次分割只能分割成数组里边一个元素,所以我们就应该是S0啊。
20:25
这是我们这种情况,同样的,如果我们是以那个结尾的,如果它摁的位置,它是以我们这个短横杠结尾的。那就是我们这种情况,所以我们这块呢,就变成GTEGT,这就是单指情况下,我们页面这么传呢,我们的这个条件就会动态并好那我们按照区价格区间的这个查询,那我们就做完了,我把这个再来一合并好这个价格区间做完了来继续,那看还有什么,那价格区间做完,那就查询这一块结束了,主要那接下来就是我们这个按照属性来进行查询,好我们来构建它,相当于如果页面给我们传递了属性的查询条件,那么就得按照属性来进行查询,好我们来判断属性的这一块,我们来进行if判断,那么如果页面他M点一个get at t RS,我们传了这个它不等于空,并且呢,它的这个lengths点一个get at t.Les我们叫S大于零,那说明它给我们传了这个条件,那传了这个条件我们就来。
21:36
按照属性给它进行过滤。那按照属性我们就来布尔quary里边菲好菲呢,我们现在来看这个属性的这个菲里边构建的这个是一个嵌入式的,所以我们现在要这么来做。我们先来准备一个corry builders,点一个以前有各种quary,我们现在要用一个嵌入式的好listed quary,这listed呢里边。
22:06
会传三个参数,第一个是pass,第二个呢,又是查询条件下来pass,我们就是它,我把这个复制过来走,接下来呢,还有一个查询条件,我们先拿过来,接下来还有一个我们这个第三个叫score mood,这个呢相当于就是我们聚合的这些结果。以什么样的方式来参与各种评分之类的,好,那现在呢,我们这种嵌入式的这个查询,我们就不让他参与评分,那么就直接score mode,我们写一个none就行了,好,来这传一个score mood,好,我们来写上,那好们来传一个它。那我们整个quary build构建呢,嵌入式的这个quary,那我们就给它传到这个filter里边好,但现在呢,最麻烦的就是这个嵌入式的quary该怎么构建,那嵌入式的query呢?那还是看我们的DSL,那是这样子的。
23:00
它里边呢,是一个布尔瑞mask,按照我们属性的ID是这个,而且必须属性的值,我们可以多值匹配,而且这种匹配呢,我们要按照页面传递过来的参数来看。由于我们这个页面at t RS,我们传了很多给大家看一下,我们意思呢,页面可能会封装好多的这个属性查询,最终就像这样。我们来比如就像这样,And at t RS等于一号属性我的值。必须是五寸。还有我们的八寸,比如我们两个二号属性,那么还得继续at ts,那等于二号属性,那必须是16G等等,以及我们的8G,好,我们的a tr多个页面呢,我们让页面这么来传。那我们希望呢,最终就来分析成这样的结果,一个at t RS相当于就是我们这个at ts这个集合里边我们封装的一个这个字符串,每一个字符串呢,那最终都长成这样,所以我们先拿到这个at t RS,我们来进行挨个遍历封装。
24:12
点一个for each,我们来进行增强否,所以呢,这个a tr,这是拿到我们的检索条件,这个检索条件呢,那最终就是页面提交的,就像这个1.1杠五寸什么什么的页面这么来提交的。所以呢,我们要按照页面的提交的这种格式分析出我们要用的数据,好,我们先来这么来分析,我们用at tr,我们页面提交的这一串值,我们就叫at tr string吧,好,那at tr string,那先点一个split,那先来分割,用短横线分割,那用短横线呢,先分割出一个字符串,那这个字符串的前边这个数据来S0,那就是我们要用的属性ID,好,我来写一下string的at t。
25:03
那相当于要检索这个属性,而我们后边的这一串数据相当于我们属性的值,而且后边的这一串S1我们还得继续进行分割,因为值呢可能有多个,我们就以冒号把它再来分割成多个,好,我们最终得到它的分割结果。这是我们所有要用的ad tr检索的属性值。好,我们把这个批注一下,这是检索的属性,ID和这个属性需要是什么值,这个属性啊,检索用的值,那把这两个搞到以后。我们接下来给这个query里边,那每检索一个属性,我们相当于给这个quary list query里边我们呢,就得搞一个这个查询,我们来看一下在这个嵌入式里边,这个查询主要是这个布尔查询组合must。
26:03
好,我们来到这一块,所以它里边点一个。我们用一个布尔查询,诶这个布尔呢,所有查询都得以这个query开始。好,我们来点一个query,它里边呢来用一个布尔查询,那这个查询我们现在别急,我现在看我们的查询条件相当于是给这里边传的,所以呢,我把这个便利放到这儿,所有的便利都要给人家这个need corry里边传一个corry builders构建的内容,好我们现在呢是一个布尔,所以我用corre builders来构建一个布玩查询,好我把这个布玩呢放到这,好我们就叫list。嵌入式的这个布尔查询,把这个嵌入式的布尔查询,我给它放到这儿,而这一块的布尔查询。就是要根据这个来拼装的,来看这个DSL,那么这个布啊,它是一个mask属性的ID,属性的值必须等于这种,所以呢,我们在这一块条件便利出来以后,那在布尔里边点一个,我们用一个mask拼装条件,而mask里边那就要用cor rebuers点上。
27:19
我们第一个term quary,好,这个term quary来看mask里边的第一个term quary是按照at ts.at t rid等于我们指定的值name,我们就写它等于指定的哪个值呢?相当于就是这个,这是我们的属性ID,我们用它来检索它,同样它里边呢,还得有东西这个n quary里边点must。它里边继续cor re builds,点一个,我们接下来查这个属性的ID是15号,属性对应的值应该是海思或者什么我们两种情况的值,所以我们在它里边再来构建一个点一个terms quary,好,这个query呢,我们的整个name还是按照我们这一块的写法来复制过来,CTRLC好放到这,那它对应的值。
28:12
就是我们分析的这个分拆出来的这样的值,好,那就相当于呢,我们每一个条件循环最终呢,都应该生成我们的一个检索条件,而这一块呢,我们整错了,如果我们是以我们的这种写法来看,我们所有便历在这都生成了一个n query,这就出问题了。我们应该是所有的便利,每一个属性查询条件都是这么一个ne,如果是我们以前相当于给mak里边拼装了多个条件,那这不可能查成功,不可能一个人它的属性ID既是15又是16,属性值呢,既是海思又是CPU,这就是一个乱的,所以呢,我们每一个都应该生成一个这个东西。
29:01
Need query,并且呢,把它们组合放到这个filter里边,那我就把这一块我们来往下放,把这一块我们得下甩过来,好,我们每一个便利的条件最终都得组合生成一个这个嵌入式的这个过滤,而且把它就得放到我们的整个的大filter里边。每一个都要形成一个N的这种查询方式啊,那在这给大家批注一下,这就是关键点,每一个必须都得生成一个。咱们这中加嵌入式的这个查询list,这个pass啊,这个查询。所以我们在这for循环,我们页面带了多少种属性ID属性值的查询条件,那就生成多少种ne query,我把这个呢,最终都拼到我们最大的这个波尔科瑞里边。
30:02
那所有的条件我们全在这拼完以后,我们这个search build,诶search build把以前的所有条件都拿来。进行封装,那么的这个search source build,我们相当于把查询条件我们就封装好了,这一块呢非常绕,其实无论怎么绕,我们都是按照这个杰森格式先来构建一个大的杰森里边套小的,那就是大的里边套小的,我们就一直按照杰森格式这么来套下来就行了。大家这一块呢,还是得多写几遍,多理解一下好,我们相当于把第一步做完了,把我们所有的查询条件构建上去了,接下来我们还要构建我们的分页高亮,包括聚合,那么下一节课继续来构建我们这个动态条件。
我来说两句