品優購商城項目(四)搜索:高亮顯示、面板搜索

這個模塊的搜索主要是使用了 solr搜索引擎+Ik分詞包,並結合緩存redis實現的一塊業務。html

1.品優購-高亮顯示

需求前端

將用戶輸入的關鍵字在標題中以紅色的字體顯示出來,就是搜索中經常使用的高亮顯示。java

主要實現的思路是:在後臺在查詢到的內容中在搜素關鍵詞部分 加上HTML的加粗顏色等其餘標籤,而後前臺顯示須要解決以HTML方式展現的問題,而不是文本。redis

後端代碼spring

修改服務層代碼ItemSearchServiceImpl.java數據庫

建立私有方法,用於返回查詢列表的結果(高亮)後端

   /** * 根據關鍵字搜索列表 * @param keywords * @return */ private Map searchList(MapsearchMap){ Map map=newHashMap(); HighlightQuery query=new SimpleHighlightQuery(); HighlightOptions highlightOptions=new HighlightOptions().addField("item_title");//設置高亮的域 highlightOptions.setSimplePrefix("<em style='color:red'>");//高亮前綴 highlightOptions.setSimplePostfix("</em>");//高亮後綴 query.setHighlightOptions(highlightOptions);//設置高亮選項 //按照關鍵字查詢 Criteria criteria=new Criteria("item_keywords").is(searchMap.get("keywords")); query.addCriteria(criteria); HighlightPage<TbItem>page = solrTemplate.queryForHighlightPage(query, TbItem.class); for(HighlightEntry<TbItem>h: page.getHighlighted()){//循環高亮入口集合 TbItem item = h.getEntity();//獲取原實體類 if(h.getHighlights().size()>0 &&h.getHighlights().get(0).getSnipplets().size()>0){ item.setTitle(h.getHighlights().get(0).getSnipplets().get(0));//設置高亮的結果 } } map.put("rows",page.getContent()); return map; }


修改ItemSearchServiceImpl 的search方法,調用剛纔編寫的私有方法 緩存

@Override public Map<String, Object> search(MapsearchMap) { Map<String,Object>map=new HashMap<>(); //1.查詢列表 map.putAll(searchList(searchMap)); returnmap; }

咱們測試後發現高亮顯示的html代碼原樣輸出,這是angularJS爲了防止html攻擊採起的安全機制。咱們如何在頁面上顯示html的結果呢?咱們會用到$sce服務的trustAsHtml方法來實現轉換。

前端代碼安全

由於這個功能具備必定通用性,咱們能夠經過angularJS的過濾器來簡化開發,這樣只寫一次,調用的時候就很是方便了,看代碼:app

(1)修改base.js

// 定義模塊: var app = angular.module("pinyougou",[]); /*$sce服務寫成過濾器*/ app.filter('trustHtml',['$sce',function($sce){   returnfunction(data){   return $sce.trustAsHtml(data); } }]);

ng-bind-html指令用於顯示html內容(2)使用過濾器

<divclass="attr"ng-bind-html="item.title | trustHtml"></div>

豎線 |用於調用過濾器

| 就是豎線,看起來有點斜是由於字體緣由

二、面板搜索

需求

咱們今天要完成的目標是在關鍵字搜索的基礎上添加面板搜索功能。

面板上有商品分類、品牌、各類規格和價格區間等條件

 

業務規則:

(1)當用戶輸入關鍵字搜索後,除了顯示列表結果外,還應該顯示經過這個關鍵字搜索到的記錄都有哪些商品分類。

(2)根據第一個商品分類查詢對應的模板,根據模板查詢出品牌列表

(3)根據第一個商品分類查詢對應的模板,根據模板查詢出規格列表

(4)當用戶點擊搜索面板的商品分類時,顯示按照這個關鍵字查詢結果的基礎上,篩選此分類的結果。

(5)當用戶點擊搜索面板的品牌時,顯示在以上結果的基礎上,篩選此品牌的結果

(6)當用戶點擊搜索面板的規格時,顯示在以上結果的基礎上,篩選此規格的結果

(7)當用戶點擊價格區間時,顯示在以上結果的基礎上,按價格進行篩選的結果

(8)當用戶點擊搜索面板的相應條件時,隱藏已點擊的條件。

實現思路

(1)搜索面板的商品分類須要使用Spring Data Solr的分組查詢來實現

(2)爲了可以提升查詢速度,咱們須要把查詢面板的品牌、規格數據提早放入redis

(3)查詢條件的構建、面板的隱藏須要使用angularJS來實現

(4)後端的分類、品牌、規格、價格區間查詢須要使用過濾查詢來實現

 

三、多關鍵字搜索空格處理

有些用戶會在關鍵字中間習慣性的輸入一些空格,而這個空格輸入後,頗有可能查詢不到結果了。咱們測試輸入「三星 手機」結果並無查詢到任何結果。因此咱們還要對空格至於作一下處理,刪除關鍵字中的空格

修改pinyougou-search-service的ItemSearchServiceImpl.java

@Override publicMap<String, Object> search(Map searchMap) { //關鍵字空格處理 String keywords = (String) searchMap.get("keywords"); searchMap.put("keywords", keywords.replace("", "")); .................. }

這裏主要是作了去掉空格的處理

 

四、按銷量排序(實現思路)

(1)增長域item_salecount 用於存儲每一個SKU的銷量數據

(2)編寫定時器程序,用於更新每一個SKU的銷量數據(查詢近1個月的銷量數據,不是累計數據)

(3)定時器天天只需執行一次,能夠設定爲凌晨開始執行。

定時器可使用spring task技術來實現,其實我的以爲在數據庫增長月銷量數據字段更合適,在業務端判斷是每個月第一天則更新數據爲1且增長銷售數量,不然增長銷售數量。

 

五、按評價排序(實現思路)

與按銷量排序思路基本相同,有一個細節須要注意:

評論分爲好評、中評、差評,咱們不能簡單地將評論數相加,而是應該根據每種評論加權進行統計。好比好評的權重是3 ,中評的權重是1,而差評的權重是 -3,這樣得出的是評價的綜合得分。

相關文章
相關標籤/搜索