00:00
前面呢,我们修改了一下,从别的系统跳转到我们的检索系统,比如我们从首页无论是选择分类,还是输入检索关键字来点击搜索,我们可以正确的跳到我们的检索系统,那接下来我们就来分析一下我们整个检索系统要检索这些商品需要哪些检索条件,因为我们最终的跳转过来,我们来到这个检索系统来可以看一下我们是由一个controller,这个controller呢来处理我们这个检索请求的,那他应该做的事情就是他在这儿来接收所有的检索条件,然后呢在这儿进行处理,处理完了以后进行返回,比如我们将这个大致的逻辑我们来先来写好,好我们在这里边呢,我们在这个实体类里边,特别我们这个实体类呢,它叫一个VO,我们应该创建一个包,不是这个类,我们创建一个VI包,我们现在呢有检索功能,好,我们先来创建一个类,它是在VI包下,我们有一个叫search per,我们所有的检索条件呢。
01:00
希望封装到这个类上,因为它有很多的检索条件,那我们ctrler呢,就应该是这样,无论是我们自己系统还是别人系统,他们跳转过来呢,都会带一些检索条件,有可能是我们的检索关键字,也有可能带上我们分类的ID等等等等,所以呢,我们就来接收,那将所有的条件,那都希望它封装到这个search p里边,那这个东西呢,我们用起来就方便多了,我们希望有一个service,比如来写上一个我们叫search service,我们就叫mail,我们的商城的这个检索service,这个service呢,我们希望有一个叫我们的检索方法,能传入我们这些参数,然后呢,要到我们最终搜索的这些结果,所以呢,我们最终希望这个service啊,能有一个叫search方法接收我们无论是从本系统还是别的系统传来的检索参数,然后呢,最终给我们。
02:00
返回一个检索结果,这是我们的result,然后呢,把这个结果我们然后放到页面来进行展示就行了,好我们希望有这么一些逻辑,那这样逻辑呢,就要写的很多,我们先来创建出这么一个接口,好,那在这儿呢,先来创建一个接口,这个接口呢,我们就叫mail search service,我们商城的检索服务没为这个接口呢,再来顺便创建一个实现类,Mail search service的实现类,这个实现类呢,来实现我们这个mail search service这个接口,然后呢,我们把它加到容器中,Enter一个service,那我们希望ctrler能调用我们这个接口,好,我们把这个接口呢导入进来,我们调用这个接口的这个search方法,能给我们返回这个最终结果,最终结果我们也不知道是什么样子的,我们先来整一个object,好把这个方法呢创建出来,那这个接口的功能,好,我们来批注一。
03:00
啊,这接口的功能这块就是检索的所有参数,然后呢,最终返回,返回咱们这个检索的结果,所以我们就希望我们跳到这个list色页面的时候,我们带上所有的这些检索参数,由我们service最终处理得到检索结果,然后呢来到页面这一块呢,都是我们要展示的最终检索结果,那接下来我们就得分析一下我们都会用哪些参数进行检索,首先第一个参数来FF,这个参数呢,就是我们的检索关键字,它呢会有一个叫keyword跳转过来,所以我们的这个参数位置,我们检索参数有可能呢,就会封装第一个我们private string,我们的keyword,这个就是页面传递过来的,页面传递过来的咱们这个检索参数,相当于我们的全文匹配咱们这个关键字。
04:00
比如说呢,这个条件是用来做全文匹配的,而且呢,我们来给它顺便就来标上an data注解,让它自动生成get set方法,好这我们能分析到的第一个条件,第二个条件我们从页面上能看到,如果我们从某一个分类进去,我们也会传入三级分类的ID,而且这些条件呢,不一定都传,有的时候只传了检索关键字,没有分类ID等等等等,但为了方便呢,我们将所有页面都能传过来的数据,他们可能传过来的数据我们都封装到这个VO里边,好这个VO的作用就是封装页面所有可能传递过来的咱们这个查询条件,那第一种它可能传入检索关键字,第二个我们还可能传入一个我们这个三级分类的ID,这个ID呢是浪类型的,我们就来写一个浪,它呢有可能页面传过来三级分类ID啊。
05:00
我们就叫三级分类ID,那除了页面能传这两个页面还能传什么呢?我们来通过仔细分析,我们来商城服务里边,我们的整个商品检索,它呢有三个入口,第一个就是我们来点击分类进来的,它会传一个分类ID,第二个是我们来搜索关键字进来的,它会来传入我们的搜索关键字,第三个才是最复杂的,比如说我们经过一些复杂的筛选条件,比如看页面,我们选中在已查询的商品里边,我选中它属于小米品牌的,或者呢是360品牌的,包括呢我还可以按照价格区间,我们来可以自定义输入价格区间的,包括呢,我们可以按照商品的某一个属性,比如凭证尺寸,它是呢五寸的,我们来进行检索,特别呢,我们检索完的结果,我们还可能进行排序,比如按照销量、价格等等排序,所以接下来非常复杂的检索条件都在这一块,前面两个呢只是最基本的。
06:00
条件好,那接下来呢,我们就来分析整个所有可能的检索条件是这样样子的,首先我们全文检索是按照商品名进行来检索,我们在这儿输一个名字,相当于是我们的keyword,它呢用来最终进行SQ的名字匹配,它来进行全文检索的,然后和前面前端页面传递的条件呢,它叫keyword,它最终是用来做全文检索的。包括呢,我们检索的时候,我们有可能还要用排序,比如我来筛选了一个价格,那现在下一次的这个检索,按照价格呢就得排序,所以我们还可以有一些排序条件,这个排序条件呢有很多,有这么几个,第一个按照价格排序,还有按照销量排序,还有我们这个综合排序,综合排序呢,我们假设就是热度评分,所以我们页面还可能传入一些排序条件,比如我们在这儿分析来一下,它可以按照我们这个销量,诶这个东东西呢,就是我们可以按照销量排序,也可以按照我们这个热度评分排序销量,然后呢,这个就认为我们是认为这个呢是热度评分,热度分他呢有可能还会按照我们这个价格排序,那除了我们这个排序外,我们的整个检索呢,还可能用到复杂的筛选功能,我们按照各种不同的属性信息进行筛选,所以我们来整个模拟我们将会出现什么情况。
07:26
好,来看一下,好,我们来到商城首页,如果我们第一次点分类进来,它会传一个CATALLO3ID门225,好,我们来就在这儿,我们拼装上来,好,第一个看到LOG3ID225,有可能呢,还会传递第二个条件,我来end第二条件是什么?我们在这个分类下,比如我们再来搜索小米,我来点击搜索,相当于这个分类下我们继续来查询小米,所以呢,我们还可能继续传入我们的keyword and keyword,我们输了一个小米,那假设呢,我们这这个三级分类的ID225,我们又输了一个keyword keyword等于小米。好,我们检索出的是这些结果,那接下来呢,我们可以基于这个结果,我们继续来筛选,比如我们先不说这个复杂筛选,我们来先来说排序,我们看到这些结果,我想按照销量进行排序,所以我们点一点销量,肯定又得拼装上一个查询条件。
08:26
而且所有的后来的查询都是基于前边查询到的结果进行查询的,所以呢,我们来继续拼上,如果呢,我们是来按照销量进行升降序,假设呢,我们有一个条件就叫cell count等于,等于什么呢?我们可能会进行升降序,所以呢,升序我们用asc,降序用DSC,但是我们这个排序条件有很多,我们可以看一下我们这个排序条件啊,有可能是销量价格或者综合排序,但是它无论再多只能选择某一个,所以我们的排序条件我希望最终拼装的是这样,Salt等于salt呢代表我的排序条件,如果按照销量,那就是cell count,你排成什么序,DECSC,那这就是降序,那升序那就是asc,好,所以我加上了排序条件,那排序条件用salt字段封装好,我们再来一个rabbit转,而且我们是按照自定义的字符串的组装格式好。
09:26
叫salt,这是我们的排序条件,排序条件排序条件呢有很多种可能,我们都给大家列在这儿,比如我们排序条件第一种可能我们用cell count的,那我们就排序条件,我们可能传成这样,Cell count a sc或者de sc,或者呢我们这个salt,我们这个排序呢,我们来分析了一下,还有可能按照热度分或者价格进行排序,那就对应的页面是这个综合排序,就是热度分,我们也可以按照价格这个评分分上架时间我们就不用了,他们呢都是一样的,好,我们现在用。
10:01
价格和我们热度分好,如果是价格的话,那么这一块呢,我们就可以写成这个SQ price好,价格呢按照升序还是降序,同样as sc还是DECSC,包括我们还可能按照另外一种,我们的这个叫综合排序,就是热度评分,热度评分呢,我们把它就规定叫hold score好,那这个热度评分同样是as sc还是de sc,这三种排序条件只能选一个好,所以我们前端还可能传入排序条件,这是我们说的第二个复杂结果,第三个那有可能还会拿来进行一些过滤,这些呢都是我们查询条件中的一些东西,比如我们这个过滤,我们来看过滤呢指的就是这一块我们可以选中,比如仅显示有货,那相当于我们这些查询到的商品里边,我们只要有货的,相当于这也是一个查询条件,我们也可以称为过滤条件,好,那现在呢,第一种过滤条件。
11:01
我们叫仅显示有货,所以呢,我们最终希望我们将所有的过滤条件也应该拼到后边,我们过滤条件呢有这么多,我们先来预分析给大家放在这儿,那么接下来还有好多的好多的过滤条件,而这些过滤条件呢,我们可以来看一下,看字to,它叫是否有货,是否有货,那如果我们选中了这个,我们如果选中了仅显示有货,那么就希望我们选中的是只有有货的这些,所以我们就应该给原来的条件上再来拼装一个,比如man汉zto叫等于零或者一,那零就代表有货,一就代表无货。所以我们的条件可能会再拼装一个,它handsto等于零或一,那还可以再拼装,我们按照SKU的整个价格区间,我们在这一块输也好,我们在这一块输也好,输了一个价格区间,比如一到我们500之间来点击确定,所以呢,我们有可能还会传入一个叫SKU price SKU price这个价格区间,区间呢,我们是这样,我们写一个一杠500,那就是呢,一到500之间,这是第一种情况,第二种比如我们只查几百以内的。
12:24
500以内的,我们这个区间我们可以查400~500的,我们想查500以内的,我们是这样输入,我们点一个确定,所以呢,我们应该是这样,什么到500,这是我们这个500以内的,包括呢,500以上的,那么就是500到我们不填值,所以我们页面呢,假设我们页面可以传这三种规则,这都是我们自定义的规则,好所以呢,我们相当于有这几个条件,我们还要进行来筛选的,好我们就把这几个条件写上,第一个来输入inte handsto,它的代表我们是否只显示有货,只显示有货,这都是我们页面要给我们传过来的,而且他们都是可传可不传的,然后呢,我们接下来继续private,那么还有我们的价格区间SQ price,好,我们这个价格区间们就叫string,把这个呢,我们就称为叫SQ price我们就叫价格。
13:24
区间查询,这是我们又分析出的一个查询条件,我们可以按照价格区间,包括呢,我们还可以按照它的品牌进行选择,还可以按照分类选择,那分类呢,我们已经在这儿有了,所以我们还可以按照品牌选择,比如我们又选中了一个品牌,来看一下,如果选中了小米,那相当于呢,我们就在在下边筛选出所有是小米商品的,所以我们现在继续来一个品牌,我们希望它呢传入一个品牌ID,比如我们选中了一个小米,我在这点一下,那它在后边呢,就得自动的缀上一个,诶我当天选中的品牌ID,比如是一号,所以这是我们的品牌ID,而且它最大的特点再来看,那在这儿呢,还能支持多选,比如我点了一个多选,相当于我在这儿得勾中N儿,N儿N儿来勾中三个同时来选中是这三种品牌的某一个都行,所以我们在这儿还可以允许多选,允许多选呢。
14:24
就给它来整成一个list,你可以来传很多,也就说如果我们按照品牌ID进行筛选的,我们可以继续给后边拼条件and们这个品牌ID等于什么,但是如果是多个品牌ID,那咋拼呢?我们就可以这样多个品牌ID,我们就直接继续来拼品牌I等于二,相当于呢,一个K的值能有多个我们这个VALUE6,所以我们这个品牌ID我们写成一个list色数组,这相当于按照我们这个品牌进行查询,进行我们这个查询的,它可以多选,这样我们又分析出我们这个页面呢,还可能传过来的查询条件,包括呢,我们还可以按照我们所查询的这些商品的属性进行筛选,而且呢,属性也是可以多选的,比如我们来看京东,京东的这个里边我们在这儿呢,随便来,我们来点击手机分类,我们点进来,比如我们按照运行的。
15:24
内存等等,你可以多选,我们来选中6G8G,我们来点一个确定,现我们来多选中是6G或者8G的,所以呢,我们在这一块过滤条件里边,除了有价格,还有品牌ID和品牌ID,品牌ID等于一等等,我们还会按照它的属性进行筛选,由于这个属性众多,没选中一个假设我选了屏幕尺寸,它的值是这个来到我们这个系统,那按照这个来看,假设呢,我选中了系统这个属性,那我怎么知道我选中哪个属性,那系统规则呢,我以后就这么来定,At t RS这个呢,就代表按照属性进行查,属性进行查,比如我们这个系统属于一号属性,好,我们就来写一个一号属性,一号属性的值是什么好,比如我们选中了其他,那么就来一号属性,它的值等于其他,那就在这儿来复制一个,好,那就叫其他这样呢,代表我选中,我要选一号属性。
16:24
值是其他的,但这个值呢,有可能又有很多,我们怎么办?我们约定呢,就用冒号进行分割,如果你有多个值,好,你选中了多个值,你不仅选了其他,还选了安卓,好,我们现在相当于查询一号,里边既是其他又是安卓的,既然还有我们这个屏幕尺寸,我们也可以多选,那么接下来继续按,我们筛选了一个属性是系统,我们还想筛选其他属性,那继续at t RS等于什么呢?假设我们二号属性叫屏幕尺寸好,那么现在呢,二号属性是屏幕尺寸,我选了两个值,第一个是五寸,然后呢,第二个我们写一个六寸。
17:06
好,我们选中了两个值,这就是我们按照属性进行筛选,那么有可能还会这样来筛选,那么接下来就来继续来写一个筛选条件,它呢也可能有很多,而且都是我们自定义瓶装的,就叫a dt RS,那按照按照属性进行筛选,那这样呢,我们就分析出了我们这个页面可能将会用到的这些条件,但其他的这些其他东西就额外多封装一些属性就行了,我就不加这么多的字段了,那么基础条件呢,就有这么多,但是大家看还有我们更复杂条件在这儿,我们现在呢,只相当于筛选了我们这一块的内容,我们按照这一块的东西,按照我们的分类也好,品牌也好,它的系统属性也好,我们最终查到结果,因为这个结果有很多,那么有可能还要分页,所以呢,我们可能还要传入页码,比如我点了下一页,那就应该是第二页,第三。
18:06
页我们还要传入页码,所以呢,我们现在要第几页数据我们继续来传过来,Private,那写一个inte的,我们叫page number,好这是我们这个页码,那这就是我们分析的有可能会传递过来的检索条件,那最终呢,我们希望我们的service就按照我们指定的这个检索条件,好,我们来实现和之前定义的接口,按照我们这个检索条件,最终去ES中给我们查到相应的结果,查到结果以后呢,再给我们返回就行了,那么可能第一次分析出这些检索条件,大家呢,有很多的不理解,没关系,我们后边呢,用到一点,我们再来说一点就行了,但是呢,我们思想就是一句话,将页面所有可能传递过来的查询条件,我们都封装成一个对象,让ctrler来接这个对象比较方便,要不然的话没有内衣。
19:06
大串,那我就应该在这儿来写上好多,比如string,你有可能给我传一个at tr,而且它可能是一个集合,我们对页面进行一一封装,你可能传来at tr,也有可能传来我们这个品牌的ID,我们在这儿得写上一大串,太麻烦了,所以呢,我们把它呢全部封装到我们这个search p里边,让spring mvc自动将页面的请求封装过来,我们发挥spring mvc的一个特性,自动将页面提交过来的所有数据,将页面提交提交过来的所有请求参数,那么这个请求的这块查询参数这块就是它的查询参数,请求查询参数封装成,封装成那这个指定的对象,我们以后呢,Service就来操作这个对象也比较方便,这是我们分析的页面的检索条件。
我来说两句