00:01
前面我们通过分析我们商品的检索页面,我们抽取了两种数据模型,第一个是我们将页面所有可能传递过来的请求参数,我们封装成了一个叫search p,还有一个呢,我们可能将页面返回的这些结果我们都抽取成了一个叫search result,结果里边包含我们的商品数据以及其他信息等等。那接下来我们controller收到我们的检索请求,就应该按照页面提交来的所有请求参数来调用业务逻辑给我们来进行检索,而所有的这些检索肯定都是去ES进行检索的,但这些检索条件呢,又非常复杂,因为有些时候页面有些条件传或者不传,那在检索之前呢,我们就先来测试一下,如果是我们该如何进行检索,那我们就先来打开kanner,好,192168,我们主要是来访问5601端口,来我们来访问kner,我们现在控制台来测试一下我们来如何检索商品,我们来到我们的。
01:01
控制台DS。好,Control end来到后边,那所有的商品呢,之前创建了一个索引叫product,我们都在这个里面保存着,我们先来检查所有,好,现在呢,查询到有26个商品,那么现在就来检索一下,来模拟我们的前端页面,所以呢,检索呢,我们主要就是来编写这个DSL,好,我们先来写一个quary,那quary里边我们先来看第一种检索,假设我们在这儿来写了手机两字,或者我来搜索华为,那就应该检索到所有的华为手机,那么在这一块就来写,因为我们可能有多种类型的检索,所以我用不来组合多查询。首先第一个是must must就是必须的意思,那必须我们现在是匹配,按照我们商品的标题来匹配带有华为两字的,那匹配呢,我们就来使用match,好啊match match呢,我们匹配的属性叫SQ title,匹配的值那就是页面给我们提交过来的,比如我们就叫华为,好,我们来搜索一下。
02:04
好,发现呢,我们搜到了八个数据啊,我们把它格式化一下,那这八个数据呢,里边都会包含我们华为的标题,那接下来我们来继续模拟,假设呢,我们不仅搜了华为,我们还是在这个手机分类下,我们选中了手机分类,选中手机分类呢,还会传一个分类的ID,那接下来我们就要按照分类ID继续来搜索,那搜索呢,我们可以继续在下边写,我们只写了第一个条件叫match,好们来继续逗号,那多个条件呢,我们继续在这,比如精确匹配,我们就来使用term,因为我们匹配的是catlo ID,但我们在这匹配的时候呢,我先不来写这个term,我们来给大家看一个东西,我们这个布里边呢有mustsk mustsk是必须的意思,那在mask呢,还可以写一种叫filter filter就是我们说的过滤,那我们以后正来约定我们的全文匹配条件,我们都写在must match里边,而我们剩下的这些条。
03:04
件,因为我们match是需要参与评分的,那剩下不需要参与评分的,比如你的分类ID必须是这个,你的品牌D必须是这些都是我们进行过滤的这些条件,那我们就来写到菲里边,其实写在must里边继续term是没什么问题的,但是呢,菲不参与评分能更快一点。好,我们来写在这里边来继续好,Filter里边我们第一个条件,第一个条件呢,我们是按照分类ID,那我就来写一个,我们来写一个term,好。这一块呢,也没有什么提示,那我们先这么来写,那先来写一个term,好我们把这个term条件来拿过来,我们这个filter呢,肯定也允许多个,好我们来写中一个以后,我们给它后边来加上这个中括号,好注意我们这个中括号位置,我们来重新格式化一下。好,那我们第一个条件就是term来精确匹配,按谁匹配呢?那现在按照三级分类的ID好,我们按它匹配,必须是225这个分类下的好,我们来继续来搜索走,我们还能查到数据八条,那没问题,那假设呢,我们又传来一个条件,现在我们3D分类的ID有了,包括我们前端模拟前端,比如我们来传了一个qword,是华为也有了,现在假设我们又来选中了品牌,而且品牌呢,我们还可以选中多个,我们希望按照多个品牌ID进行检索,那前端呢,会这样传品牌的ID等于一号的,并且或者我们这个品牌ID等于二号的,那么这是一个集合,只要是这两种,哪种都行,那么在这呢,就可以来继续来查一个属性,有多个值,我们就来不写terms了,来写一个东西叫terms,那这一块没有提示,我们就来自己来写,我们就叫terms,大家可以来参照语法或者呢。
04:59
最快的方式,大家可以在下边来自己写一个带语法提示的,来给这边来复制,给我们来get一个,好,我们来给这儿来进行复制,我们就叫杠search,我们来写一个quarry quarry里边。
05:17
有一个布尔里边我们来写filter filter,我们现在要term,我们要多个值匹配,那多个值呢,属性的ID,那我们现在按照品牌D,我就拿来品牌ID,比如我们页面传了两个值一二,我们现在呢,还要查一个九,好,那现在九模拟页面传了多个值,那我把这个term呢,注意从这个括号到这结束,我们来复制过来,那给这一放就行了,好,我们在下边写好提示,给这一放来重新格式化一下,那现在相当于来查这些品牌的商品,我们来查询,因为包含九号了,所以我们现在还能查出来,现在我们相当于添加了我们商品的品牌的查询,那接下来还有下边。
06:06
我们按照商品的属性来进行检索,比如我们有一个属性是屏幕尺寸,假设呢,它是一号属性,我们想要检索5.56以上的,那么这一块呢,会这么来传,At t RS等于一号属性,比如5.56诶以上的我们按照这个值检索的,包括呢,如果我们还有更多属性,比如机身颜色是二号属性,那么就可以继续按照at t RS。等于二号属性,而属性呢,对应的值我们还可以传多个,比如白色,白色冒号,蓝色,哎,我们以前呢,是这么来约定的,那相当于我们就在这儿要继续来检索,我们按照属性的ID进行检索,比如我想查CPU品牌,既是海思的又是骁龙的,我们要查两种,那么可以怎么查呢?首先属性的ID必须满足我们指定的要求,属性的ID是指定的值,并且它的值是我们指定的,那么就可以来这么查,我继续在下边写好,我们来复制上面。
07:12
我们把这一块来删掉,好在下边少了一个大括号来给它补全,我们现在来按照品牌的ID来查,我先来写一个term,品牌的ID呢,不是品牌ID了,是属性ID,那就应该是at ts.at TD必须等于我们指定的值,现在我想查15号的这个属性,而且它的值也必须是我们满足的值,那值呢,我们相当于就可以再来写一个at try6的值是什么?那我们先把这个复制来,我们先来看一下,好,我们把这个括号选中,我们看这一块呢,被选中了一个小方块框着,把这一块呢整个复制过来,我们放到呢,我们这个terms的下边,好,我们这个terms在这儿结束,走,那现在按照属性ID进行匹配的来看一下能不能匹配上走诶我们发现呢,我想查实物号属性ID的结果,一上来就查不到,那查不到的原因是。
08:12
什么,那就得回归到我们以前,以前呢,我们声明商品的时候,我们说这个商品我们来看一下我们这个商品的这个数据,我们返回到这个商品数据里边呢,SQ模型,由于它的这个属性,它是一个嵌套对象,这个嵌套对象呢是一个数组,我们说默认ES会扁平化处理,所以呢,我们给它声明了它的这个类型是ne的,我们可以给大家看一下,我们获取一下我们商品的这个映射,这个映射呢,我们当时声明a tr这个属性是一个ne,相当于是一个嵌入式的属性,那所以呢,嵌入式的属性查询就不能像我们这样直接来写了CS什么什么嵌入式的属性查询,我就得用嵌入式的查询方式,我们在这来搜索一下。
09:00
我们打开这个官方文档,我们来直接搜索ne,好,这里边呢有一个叫ne quary,我们嵌入式的这个查询来复制过来,那现在来看,如果我们某一个属性声明是是一个嵌入式的,那想要查询,那就应该用我们这个ne这种规则,比如我们在qua里边写了一个ne的嵌入查询,当然我们现在的这个属性查询,我们都在filter里边,所以我们在filter里边也可以来写我们这个嵌入式的查询,包括以前我们这种也是查不出东西的,比如我们来查商品索引,我们来查它里边有15号属性的,本应该大家都有的,但是它一个都查不到,但是如果我们来改为嵌入式的,好,我把这个term呢来删掉,那现在改为嵌入式的,我们叫ne。那嵌入式这一块呢,首先指定有一个pass,这个pass是什么?我们先来给大家查,所有看一下这个pass呢,指的就是我们嵌入的这个属性,这个对象的名字,它叫at t RS,相当于我们要从这个里边来查这些嵌入的属性,那pass指定它接下来这一块query,就像以前一样,该怎么指定还怎么指定。
10:15
它能组合多查询,那我就来写一个布尔好,我来组合一个多查询,你现在呢,必须term,按照我们的要求must好。Term。必须满足,满足什么呢?我们at tris里边的at trid等于我们15号,如果我们这么来查,来看一下走,诶现在我们查到了,只要是15号属性的我们都有,但是呢,与此同时我们还想要除了它的属性ID是15号,而且属性的值必须满足我们几种可能,所以呢,我们在must里边一个条件结束以后来继续第二种,由于值呢,有很多种可能,所以我来写terms terms呢,接下来就是at t RS里边的at t r y6 Y6,值呢,比如我来选中一个海思,好,我把这个呢先选中一个。
11:09
我们来看还有没有其他的属性的品牌,好,我们来找一下CPU的这个品牌,除了海思有没有骁龙之类的,好,这有一个叫以官网信息为准的,好,我们就把它复制过来吧,比如说呢,属性必须是15哈,值呢必须是我们列举的某一个值们来看这个能不能查出来走我们呢也是可以查出数据的,所以呢,我们的属性查询就比较特殊,与我们这个属性查询它是一个嵌入式的,那我们就必须使用我们这个嵌入式的查询,那么就把这个完整的属性查询这个条件我来复制过来,好,这个小括号在这儿结束来复制过来,如果我们想要属性查询,那我们就在这儿再多拼装一个term,好,只不过这个呢是一个嵌入式的。我们在整个这个嵌入式的整体里边,我们是来做属性的ID以及属性的值匹配的,我们在这来进行查询的,好,我们把它同时再来格式化一下,那相当于把这一块功能就做好了,前端呢能给我们传来属性,我们也能查了,但前端呢,还有可能给我们传来这些排序的值,相当于我们以前的查询,那至此就结束了,那我们想要排序,我们继续来写,那我们的排序们来看查询呢,在这这是一个quary,那排序我们就要用到另外一个,我们排序呢,有一个叫sot,诶用它来进行排序,我们按照哪个字段排序,我们可以在这来进行指定,比如呢,前端可能会给我们传这么多种排序,可能我们来过来看一下,那在search p的时候,他呢,有可能是按照s count销量,也有可能按照SQ price,有可能按照hot score,那无论是他按照什么,我们业务把这个。
12:59
那拆出来以后,我们最终在这儿,比如我们来按照SQ的price好,按照它我们排序,按照降序进行排列好,我们现在按照这个查询走,我们这儿没有查到结果,结果没有查到结果的原因是由于我们这些商品属性里边好把这个嵌套的东西我先删掉,看有没有结果。
13:21
走,那就是我们以前的这个条件里边都没有能查到结果的,查华为225129,对,我们把之前的这个一定要删掉,这个不删掉是没结果的,好我们把这个呢重新放上来,现在呢肯定是有结果了,那们之前把错误的那个属性查询一定要删掉,好我们现在来尝试查询,我们把这个格式化好走现在我们可以查到数据,而且呢,我们现在指定了排序规则,按照价格排的,所以我们查到的这些商品里边,我们来看一下价格最高的6299,我们再来往下还有我们的价格,这都是6299们来看是不是降序排列,我们看下边有没有比6299低的,诶5799没问题,那么这个排序呢,就算是也能加上了,好,查询在以前呢,就很简单,我把这个缩起来,查询在这儿,这是我们的排序查询里边主要是嵌套的next test,那排序完了以后,我们来看还会有什么。
14:22
还会有我们这个,比如仅显示有货,这个按照库存查,按照库存呢,我们这有一个叫汉子to,那按照库存,这其实还是一个查询,所以我们就来到这儿,如果我们filter进行过滤的时候,哎,我们把这些条件都缩起来,这是按照属性进行过滤,诶我们现在呢,按照库存,按照库存呢,我们还是一样term,我们直接把这个以前用过的term,我们来复制一个这个term拿过来。按照属性查,那就是term,我们的hands字to就必须是我们指定的处了,好hands字to它呢就必须是处有库存的,好我们把它格式化好,那现在来进行查询,每一次拼装条件以后,我们都尝试查询有值,那就没问题了,那我们想要查没库存的,比如我们来改成false,那肯定查不出结果走好那没问题,我确定是对的,好,那我们来参照我们的前端条件,我们keyword按照关键字匹配的,我们来一一对一下,按照关键字匹配的,在华为,我们在ma里边。
15:32
进行match了,而且我们这个三级分类,我们除了进行模糊匹配,这样算评分,我们算放到must里边,剩下我们都放到了过滤里边,Filter好按照分类也有了,包括呢按照品牌的ID多个那也有了。好,我们把这个呢也说一下,品牌ID也有了,哎,我们确认过的啊,打一个对号,我们的这个这两个也有了,还有我们按照排序条件,排序条件呢,我们在后边也写了排序条件,好,那我们就也有了传入不同的属性,我们后来进行不同排序就行了,那接下来,而且按照我们的sto是否显示有货,我们也进行查询了,我们这个有货的是这个term,好没问题,包括按照属性检索,At t RS所有的属性检索我们也拿过来了,虽然我们在这只写了一个属性匹配,15号属性是什么,那16号属性是什么?那么接下来就应该再来写一个这个整体,我们再复制一个,那么这个整体就代表属性呢,必须是15号属性,而且是这两个值,16号属性可千万不能这么写,大家写一个term斯,诶,它必须是十五十六,这样就代表的不是说15号属。
16:49
这两种痣。而是呢,属性是15或者16,值呢是它或者它,那就不是我们本意了,好,我们这个属性呢,我们也写了,那再来看还有一个没写,那价格区间的查询,好价格区间查询我们在这儿再来加上,那我们有可能按照价格区间进行检索,所以我们这个检索条件里边呢,我们再来写一个,如果想要检索,我们还可以有一种检索方式叫RA,按照区间,区间呢我们是SKU price,我们按照价格的GTE,那就是大于等于多少,比如我们大于等于0L TE,那就是小于等于多少,比如小于等于6000,好,那么就来再来加上这个条件,好,我把这个大括号放在这,它是在这结束的,我们把这个复制过来,按照我们的价格区间,我们复制上来,把它格式化,好,我们重新缩起来。
17:46
好,每一种呢,我们在这儿都加上了,这是我们嵌套的属性查询,按照库存查询,按照价格区间,我们正好来查一下,看有没有结果走。那相当于查6000以内的,现在呢,只有四个结果了,把以前六千二的我们都过滤掉了,好,那我们这个价格区间也有了,那价格区间也有了,那接下来就是我们的页码,好按照页码来进行查,那这个呢是排序,这个是检索啊,那我们的页码在这呢,ES里边分页专门有一个叫from,从哪开始size到哪结束,这就模拟的是我们分页,那么这个from size我写一个零五,那就是从。
18:35
第一个记录开始查询五个,这是没什么问题的,我们可以给大家看走,我们现在总结过呢,只有四个,如果我们模拟每一个数据都是一页,我们来翻一页,那就应该是这样,从零开始查一个,这是第一页数据,然后呢,从一开始再查一个,这是第二页数据,从二开始再查一个,这是第三页数据,从三开始再查一个,这是第四页数据,然后呢,从四开始再查一个,那就没数据了,所以我们hit命中的记录就是空的,因为总共呢有四页,好,那这一块呢,一定写的都是索引,这是我们的分页查询。另外还有一个最重要的查询,大家看到我们如果检索的是手机华为之类的,我们按照关键字检索了,那查出来的东西,如果我们匹配的这个华为什么呢?关键字呢,就应该是红颜色,我们把这个呢称为高亮,那高亮呢,在ES里边我们是来这样写的高亮。
19:36
的语句,我们来写一个叫highlight,它叫高亮,那怎么高亮呢?它可以来指定prenk,就是我们说的前置标签,它还可以指定我们这个叫post tags,我们的后置标签,这两个有什么用?来我给大家看一下,比如我前置标签,我写一个BB呢,代表加粗,而且呢,我来指定了,你看我直接写的是一个HTML文档。
20:02
我们写了一个color red来指定了颜色color red,诶我们这一块呢,要用style来指定,那样式给它指定了color red。而我们的后置标签也是一个结束标签B的结束标签,那如果我们使用了高亮功能,大家来看有没有什么效果,走我们查出来的数据,由于我们在这儿查询呢,是按照我们这个名字模糊匹配华为的,所以接下来我们来看每一个查到结果,杠source代表呢,他查询结果,这是我们原本的数据和杠source at tr它里边的数据来看。而要高亮的是我们这个SQ的title,所以我们在这得再指定一个fair相当于我们高亮哪个属性,我们现在来高亮SKU title,比方说如果我们匹配了,把SKU title给我们高亮显示来看一下,我们这一块呢,语法提示错了,那就我们这个属性不能直接来写。
21:03
刚说了我们这个属性啊,这个字段不支持直接来写字符串,那么就来看它里边对象,如果写的话能写什么,我发现我在这呢写了一个name,它会提示我们的属性,所以呢,这一块的大括号里边就指的是我们要高量的属性,我们写一个SQ抬头,那这个大括号里边就是对我们高亮属性的一些设置,我们可以先暂时不设置,我们来给大家看一下走,那现在加入了高亮功能,我们指定让SQ title进行高亮了,前置标签,后置标签也指定了,来看查询到结果杠,S是它的原本结果值。我们来看每一个命中的结果,除了杠S里边还有一个叫highlight高亮,而高亮的时候呢,他把这个SQ title大家来看一下,写了一个中括号。把我们匹配的这个东西,他用我们指定的这一段HTML给我们包起来了,相当于就是这个内容,那如果我们把这个内容让前端页面直接来展示,那相当于华为这两个字就变成红颜色的了。
22:12
所以我们高亮需要在这儿来进行指定,所以我们一个完整的在这儿查询检索我们这个商品信息,我们就要包含这么几处功能,第一处是我们这个模糊匹配模糊。匹配,第二个是我们filter里边,我们按照分类进行匹配,接下来呢,相当于就是我们的过滤,过滤里边我们有非常多种过滤条件,按照属性,按照属性还有我们这个分类,还有我们这个品牌。包括我们的价格区间,价格价格区间以及我们的库存。我们这五个东西,那都是我们不同的过滤属性,那么这个结构除了我们的模糊匹配过滤,还有我们的排序,所以我们还要完成排序功能,我们还要完成我们的分页功能,我们还要完成我们的高亮功能。
23:19
那这是我们说的整个查询的DSL语句。但这样就完了吗?其实最难的功能在这儿来看,我们每查一个东西以后,比如我选中了小米、华为,按照这些条件,我们查出数据以后,下一次我们这一块要选的内容是动态变的,它怎么变,它是根据我们已查到的所有内容来聚合分析出我们查到的这些商品所涉及到的属性,以及他们的值都有哪些,以及他们所涉及到的品牌还都有哪些,相当于我们要完成聚合分析功能,所以我们再来看一下这个聚合分析,这才是呢最难的。好,我们先把这个聚合分析放在这儿,我们下节课再来看。
我来说两句