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