這個模塊的搜索主要是使用了 solr搜索引擎+Ik分詞包,並結合緩存redis實現的一塊業務。html
需求前端
將用戶輸入的關鍵字在標題中以紅色的字體顯示出來,就是搜索中經常使用的高亮顯示。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; }
前端代碼安全
由於這個功能具備必定通用性,咱們能夠經過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,這樣得出的是評價的綜合得分。