說明:搜索模塊針對的是買家用戶,在找菜品找的很費勁下的一種查詢方面。目前也是快速的檢索商品。html
對於移動端的APP買家用戶而言,要求的速度在3秒內完成。支持模糊查詢,因爲業務實戰表面,整個搜索頻率不到18%-25%之間java
同時業務也不算很大,因此並沒採用java全文檢索技術.(lucene等)。這裏採用的就是基本的模糊查詢。數據庫
1. 搜索維度的是思考。後端
1.1 買家搜索的內容頗有多是針對菜品的自己屬性而言,因此涉及到的內容有商品名稱,商品別名,商品標籤,商品描述,規格的名稱,加工方式等。緩存
1.2 咱們知道模糊搜索會致使索引失效,同時整個查詢性能也是有影響的。app
1.3 業務形態顯示有些熱點的詞語與內容能夠作JVM緩存以提升整個單品的購買率。好比土豆如今分析出不少人要,若是咱們能夠跟某個商家談好,一天性能
須要10w斤土豆的量進行供應,那麼整個頁面會出現這個關鍵字的默認顯示。這個是後端靈活配置的。學習
2. 對於買家搜索的關鍵字,咱們須要數據庫進行記錄,這樣能夠從系統級別算出買家會須要什麼,能夠進行鍼對性的營銷.this
相關數據庫表的設計以下:spa
CREATE TABLE `buyer_search` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自動增長ID', `buyer_id` bigint(20) DEFAULT NULL COMMENT '買家ID', `words` bigint(20) DEFAULT NULL COMMENT '賣家ID', `create_time` datetime DEFAULT NULL COMMENT '建立時間', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='買家搜索記錄表';
補充說明:目的實際上是很明確的,就是記錄買家搜索的關鍵字以便分析與研究用。爲了更好的體驗用戶。
相關業務代碼以下:
/** * APP全文搜索 新 * @param request * @param response * @param keyword * @return */ @RequestMapping(value = "/search/new", method = { RequestMethod.GET, RequestMethod.POST }) public JsonResult newSearchGoods(HttpServletRequest request, HttpServletResponse response,Long userId,Long regionId,String keyword){ try{ logger.info("SearchController.search.keyword:搜索內容:" + keyword); //搜索結果按商家顯示 //List<SellerVo> list = sellerService.searchSeller(regionId,keyword); //搜索結果按商品顯示 List<NewSearchVo> list = goodsService.newSearchGoods(userId,regionId,keyword); return new JsonResult(JsonResultCode.SUCCESS, "查詢信息成功", list); }catch(Exception ex){ logger.error("[SearchController][newSearchGoods] exception :",ex); return new JsonResult(JsonResultCode.FAILURE, "系統錯誤,請稍後重試",""); } }
VO對象以下:
/** * 搜索顯示類(APP全局搜索) */ public class NewSearchVo implements Serializable{ private static final long serialVersionUID = 1L; /** * 來源於users的ID */ private Long sellerId; /** * 店鋪名稱 */ private String sellerName; /** * 店鋪別名,能夠理解爲簡稱 */ private String sellerAlias; /** * 店鋪logo */ private String sellerLogo; /** * 店鋪評級,默認爲0 */ private int sellerRank; /** * 店鋪評分 */ private Double sellerGrade; /** * 搜索後商品列表 */ private List<GoodsVo> searchItemList; public Long getSellerId() { return sellerId; } public void setSellerId(Long sellerId) { this.sellerId = sellerId; } public String getSellerName() { return sellerName; } public void setSellerName(String sellerName) { this.sellerName = sellerName; } public String getSellerAlias() { return sellerAlias; } public void setSellerAlias(String sellerAlias) { this.sellerAlias = sellerAlias; } public String getSellerLogo() { return sellerLogo; } public void setSellerLogo(String sellerLogo) { this.sellerLogo = sellerLogo; } public int getSellerRank() { return sellerRank; } public void setSellerRank(int sellerRank) { this.sellerRank = sellerRank; } public Double getSellerGrade() { return sellerGrade; } public void setSellerGrade(Double sellerGrade) { this.sellerGrade = sellerGrade; } public List<GoodsVo> getSearchItemList() { return searchItemList; } public void setSearchItemList(List<GoodsVo> searchItemList) { this.searchItemList = searchItemList; } }
3, 數據查詢性能暫時的基本知足要求,也貼出來給你們一塊兒參考,目的是共同窗習與思考.
<!-- 全局搜索商品 新--> <select id="newSearchGoods" resultMap="newSearchResult"> <include refid="newSearchSelect" /> <include refid="newSearchFrom" /> <include refid="searchWhere" /> <if test=" keyword != null"> and (g.goods_name like concat('%',#{keyword},'%') or g.goods_as like concat('%',#{keyword},'%') or g.goods_label like concat('%',#{keyword},'%') or g.goods_brand like concat('%',#{keyword},'%') or g.goods_desc like concat('%',#{keyword},'%') or gf.format_name like concat('%',#{keyword},'%') or pm.method_name like concat('%',#{keyword},'%') or s.seller_name like concat('%',#{keyword},'%') or exists(select 1 from category where category_id = g.category_id and category_name like concat('%',#{keyword},'%') ) ) </if> <include refid="searchOrderBy" /> </select>
總結,因爲搜索這塊所涉及的業務相對而言比較少,功能也比較單一,含金量不是很高,因此互相學習。
對於擴展方案,若是這塊的業務發現很大,能夠採用中文分詞記錄,進行數據的挖掘,已經冷熱點數據的一個分離等等,這個後期你們有須要的話,咱們再研究。
相關業務運營截圖以下:
轉載自-- https://www.cnblogs.com/jurendage/p/9062649.html