目】商品搜索開發(fā)復(fù)盤(1):根據(jù)需求拆解搜索接口的設(shè)計(jì)邏輯)
目錄一、搜索功能整體實(shí)現(xiàn)思路1. 為什么不用MySQL全程基于ES做搜索2. 整體核心邏輯傳參 → 處理 → 出參1.1 傳參構(gòu)造ES查詢條件1.2 處理執(zhí)行ES搜索1.3 出參封裝返回前端的完整數(shù)據(jù)二、核心代碼流程總覽核心復(fù)盤小結(jié)前言搜索功能的編寫比較復(fù)雜首先搜索條件繁多有關(guān)鍵字、價(jià)格、品牌、規(guī)格等。其次返回的結(jié)果除了搜索到的商品還要返回搜索面板包含關(guān)鍵字對(duì)應(yīng)的品牌、品類、規(guī)格等還要將搜索條件回顯回去供前端操作。本篇先對(duì)大體實(shí)現(xiàn)思路進(jìn)行回顧然后再細(xì)復(fù)盤每一處的實(shí)現(xiàn)。我們要實(shí)現(xiàn)的樣式可以參考京東的面板。一、搜索功能整體實(shí)現(xiàn)思路1. 為什么不用MySQL全程基于ES做搜索MySQL正排索引查詞要翻所有文檔只適合簡(jiǎn)單 CRUD。面對(duì)商品關(guān)鍵字分詞、模糊檢索、多條件篩選、數(shù)據(jù)聚合場(chǎng)景性能極差、無(wú)法實(shí)現(xiàn)分詞匹配。而 Elasticsearch 基于倒排索引設(shè)計(jì)它會(huì)先拆詞再記這個(gè)詞在哪些文檔里專門適用于解決全文檢索場(chǎng)景。因此項(xiàng)目將商品搜索單獨(dú)抽離基于ES實(shí)現(xiàn)。2. 整體核心邏輯傳參 → 處理 → 出參1.1 傳參構(gòu)造ES查詢條件關(guān)于傳參就看一個(gè)接收后是否需要處理。前端傳入GoodsSearchParamJSON參數(shù)和MySQL的Goods實(shí)體一樣是面向業(yè)務(wù)存儲(chǔ)設(shè)計(jì)的只保存商品主表字段而ES是面向搜索場(chǎng)景需要品牌、分類、規(guī)格等多表的冗余字段。我們需要把前端可讀的業(yè)務(wù)參數(shù)轉(zhuǎn)換成ES可識(shí)別的檢索語(yǔ)法適配ES的查詢規(guī)則。所以首先我們要把前端傳過來(lái)的數(shù)據(jù)構(gòu)造成ES搜索條件。1.2 處理執(zhí)行ES搜索我們的處理就是實(shí)現(xiàn)商品的搜索。ES實(shí)現(xiàn)商品搜索通過注入ElasticsearchTemplate調(diào)用search方法傳入構(gòu)造好的ES查詢條件指定映射實(shí)體GoodsES即可完成ES數(shù)據(jù)查詢。1.3 出參封裝返回前端的完整數(shù)據(jù)這是整個(gè)接口的核心也是區(qū)別于普通查詢的關(guān)鍵。ES原始查詢結(jié)果不能直接返回前端需要二次封裝對(duì)應(yīng)兩個(gè)核心需求1、分頁(yè)商品數(shù)據(jù)將ES查詢的原始數(shù)據(jù)封裝為Page分頁(yè)對(duì)象提供商品列表、總條數(shù)、頁(yè)碼等用于前端渲染商品列表2、搜索聚合面板數(shù)據(jù)遍歷所有搜索結(jié)果聚合去重品牌、品類、規(guī)格數(shù)據(jù)生成篩選面板同時(shí)回顯用戶的搜索參數(shù)保證前端搜索條件不丟失。二、核心代碼流程總覽// 搜索產(chǎn)品 Override public GoodsSearchResult search(GoodsSearchParam goodsSearchParam) { // 1.構(gòu)造ES搜索條件 // 2.搜索 // 3.將查詢結(jié)果封裝為Page對(duì)象 // 4.封裝結(jié)果對(duì)象 // 4.1 查詢結(jié)果 // 4.2 查詢參數(shù) // 4.3 查詢面板 return null; }核心復(fù)盤小結(jié)1、1、2步是內(nèi)部查詢過程只負(fù)責(zé)和ES交互無(wú)對(duì)外返回?cái)?shù)據(jù)2、3、4步是最終出參核心所有給前端展示的列表、分頁(yè)、篩選框、參數(shù)回顯全部來(lái)自這兩步也是搜索功能的業(yè)務(wù)核心。