優樂選電商分佈式系統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中方法做的,就能開展我們的需求了

願景

願君勿以浮沙築高臺,指點江山,用代碼書寫未來

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章