优乐选电商分布式系统solr搜索分析

分析需求

1.通过spring data solr提供的分组查询完成商品分类列表的查询

2.将品牌数据和规格数据进行缓存(后台操作),从缓存数据中读取数据显示在面板上

3.查询面板的条件构建与撤消操作是前端来负责做这件事(angularJS处理)

4.spring data solr的过滤功能
在这里插入图片描述
实现过程

下面的分析主要体现在其后台的数据怎么获取,怎么实现的具体实现的细节来实现的,而且是重点的讲解的是其思想,像前端的展示和solrTemplate的具体的api的调用,就不在详解,后台程序员就做点本职工作嘛,嘿嘿

数据流和数据建模分析
正如建哥语重心肠的讲到一般高手都是玩数据流的,哈哈,咱也不是高手,那怎么就从数据流入手,明白咱们前台需要展示什么数据,咱们后台写实现就完了,经过分析就是一个map集合,里面对应了不同添加的key和value信息,比如品牌信息,规格信息之类的
在这里插入图片描述
商品分类的实现
这里主要是通过solr里面的solrTemplate的分组方法实现其相关的分组信息,这里菜鸡就不多讲了,直接贴出代码,具体实现是相关api的调用,我反正自己手写不出来,哈哈

//根据指定搜索关键字,获取对应分类   分组查询(商品分类列表)
    private List searchCategoryList(Map searchMap){

        List listReturn=new ArrayList();
        //1、创建查询器对象
        SimpleQuery query = new SimpleQuery();
        //2、创建查询条件对象
        Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
        query.addCriteria(criteria);
        //3、设置分组字段 分组配置项对象
        GroupOptions groupOptions = new GroupOptions().addGroupByField("item_category");
        //关联到查询器对象
        query.setGroupOptions(groupOptions);

        //4、发出查询    分组查询其相关的信息
        GroupPage<TbItem> groupPage = solrTemplate.queryForGroupPage(query, TbItem.class);
        //5、获取分组入口  分组结果对象
        GroupResult<TbItem> groupResult = groupPage.getGroupResult("item_category");
        //6、针对分组字段item_category分组封装,获取对应对象
        Page<GroupEntry<TbItem>> groupEntries = groupResult.getGroupEntries();
        //7、获取分组封装
        List<GroupEntry<TbItem>> list = groupEntries.getContent();
        //8、遍历封装集合  显然是将分组的结果添加到返回值中
        for (GroupEntry<TbItem> entry : list) {
            listReturn.add(entry.getGroupValue());
        }
        return listReturn;
    }

商品品牌和规格的实现

问题引出:
我们搜索出了商品分类信息,然后给我们反馈出了商品的品牌和商品的规格,这是为什么呢?这三者有什么关系呢?我们怎么实现这种特效呢?我们要查询出来呢?

个人分析

1.首先这是一个比较重要的搜索条件,客户点击的次数比较频繁,我们不妨将其写在redis中,这样就能加快用户的访问效率

2.我们要分析数据表,怎么来实现的过程,我们只有分析了数据表之间的关系才能得到结论,我们自然而然找到了item_cat表,这里面有个字段name是商品分类的信息,其对应的有一个外键type_id,恰好是tpye_template的主键,这样我们就能对应这里面的信息,这样就能够达到我们点击商品信息,下面的商品品牌和规格的实现
在这里插入图片描述
在这里插入图片描述
3.我们不妨使用redis中的Key Value 的形式来实现其相对应的信息
判断其相关的redis中存储的数据
3.1.根据商品分类名称(key)来查询模板表(商品ID)(value) 第一组key value
3.2.根据模板ID(key)缓存模板表的品牌列表(value) 第二组key value
3.3.根据模板ID(key)来缓存模板表的规格列表(value) 第三组key value
我们这样写就可以实现了其商品的品牌和规格在redis中的缓存

/**
     * 根据父类的id来查询商品信息
     * @param parentId 父类的id
     * @return  返回对应的集合的数据
     */
    public List<TbItemCat> findByParentId(Long parentId) {
        TbItemCatExample example = new TbItemCatExample();
        TbItemCatExample.Criteria criteria = example.createCriteria();
        criteria.andParentIdEqualTo(parentId);

        //每次执行查询的时候,一次性读取缓存进行存储 (因为每次增删改都要执行此方法)
        //将模板Id放入缓存中去执行 (商品名称作为key,商品ID作为value)
        List<TbItemCat> list = findAll();
        System.out.println(list.get(0).getName()+"****");
        for(TbItemCat itemCat:list){
            //显示是商品的hash表做数据存储的,可以根据key获取其value值
            redisTemplate.boundHashOps("itemCat").put(itemCat.getName(), itemCat.getTypeId());
        }
        System.out.println("更新缓存:商品分类表");

        return itemCatMapper.selectByExample(example);
    }

在这里插入图片描述

  /**
     * 将数据存入缓存
     */
    private void saveToRedis(){
        //获取模板数据
        List<TbTypeTemplate> typeTemplateList = findAll();
        System.out.println("!!!!!!!!!!"+typeTemplateList);
        //循环模板
        for(TbTypeTemplate typeTemplate :typeTemplateList){
            //存储品牌列表
            List<Map> brandList = JSON.parseArray(typeTemplate.getBrandIds(), Map.class);
            redisTemplate.boundHashOps("brandList").put(typeTemplate.getId(), brandList);
            //存储规格列表
            List<Map> specList = findSpecList(typeTemplate.getId());//根据模板ID查询规格列表、包括规格选项
            redisTemplate.boundHashOps("specList").put(typeTemplate.getId(), specList);
        }
    }

在这里插入图片描述
4.到此为止我们所需要的前台的展示的数据就除了分页的就全部得到,后面就是api中方法做的,就能开展我们的需求了

愿景

愿君勿以浮沙筑高台,指点江山,用代码书写未来

在这里插入图片描述

发布了63 篇原创文章 · 获赞 54 · 访问量 9127

猜你喜欢

转载自blog.csdn.net/loveyouyuan/article/details/103340951
今日推荐