一、显示这些平台属性值列表,是根据用户搜索的内容提取出来(剔除不符合的其他属性值),不全部显示平台属性值。
比如符合16G属性值的产品,用户点击16G,就把16G的产品中没有的属性值剔除。
(1)可以使用es的aggregation聚合函数抽取平台属性
这个效率比较低,因为它不同于mysql,它这个聚合结果的过程损耗太多时间了。
es查询的效率虽然很高,但查询到的数据,使用聚合函数,还要统计每个商品拥有多少相同的属性值id,等待统计结果,再把它返回给你,性能较低!
// es的聚合函数aggs
TermsBuilder groupby_attr = AggregationBuilders.terms("groupby_attr").field("skuAttrValueList.valueId");
searchSourceBuilder.aggregation(groupby_attr);
这两行代码就可以统计每个商品拥有多少相同的属性值id,之后再创建一个es的属性值数据库,es根据统计的id去查询属性值名称并返回给java后端,再传到前端即可。
(2)使用java代码抽取平台属性
因为从es查询出来的结果列表数据,全部包含了属性值,我们可以直接使用!!!
A 计划(不推荐):
先到mysql查询skuId符合的相关平台属性值id,并且加distinct去重!(连数据库1次)
然后根据平台属性值id再去查询平台属性和属性值表,返回结果即可!(连数据库2次)
B计划,只需要连数据库1次,如果放到redis上,一次都不用连(推荐):
使用算法,使用for循环,使一个一个重复的id去掉,这样太笨了。
二、回归数据结构,使用set去重!!!
基础知识:
Java中的集合有三大类:set(集)、list(列表)、map(映射)
List(列表):元素有序可重复
Set(集):元素无序不可重复
Map(映射):标准的Java类库中包含了几种不同的Map:HashMap, TreeMap, LinkedHashMap。其中在制作sku商品详细页面的时候,就制作过哈希表map,用来提高查询效率!
故此,这里也可以应该java集合,使用set(集)自动去重(厉害吧