【电商项目】商品搜索开发复盘(1):根据需求拆解搜索接口的设计逻辑

发布时间:2026/8/26 18:22:36
【电商项目】商品搜索开发复盘(1):根据需求拆解搜索接口的设计逻辑 目录一、搜索功能整体实现思路1. 为什么不用MySQL全程基于ES做搜索2. 整体核心逻辑传参 → 处理 → 出参1.1 传参构造ES查询条件1.2 处理执行ES搜索1.3 出参封装返回前端的完整数据二、核心代码流程总览核心复盘小结前言搜索功能的编写比较复杂首先搜索条件繁多有关键字、价格、品牌、规格等。其次返回的结果除了搜索到的商品还要返回搜索面板包含关键字对应的品牌、品类、规格等还要将搜索条件回显回去供前端操作。本篇先对大体实现思路进行回顾然后再细复盘每一处的实现。我们要实现的样式可以参考京东的面板。一、搜索功能整体实现思路1. 为什么不用MySQL全程基于ES做搜索MySQL正排索引查词要翻所有文档只适合简单 CRUD。面对商品关键字分词、模糊检索、多条件筛选、数据聚合场景性能极差、无法实现分词匹配。而 Elasticsearch 基于倒排索引设计它会先拆词再记这个词在哪些文档里专门适用于解决全文检索场景。因此项目将商品搜索单独抽离基于ES实现。2. 整体核心逻辑传参 → 处理 → 出参1.1 传参构造ES查询条件关于传参就看一个接收后是否需要处理。前端传入GoodsSearchParamJSON参数和MySQL的Goods实体一样是面向业务存储设计的只保存商品主表字段而ES是面向搜索场景需要品牌、分类、规格等多表的冗余字段。我们需要把前端可读的业务参数转换成ES可识别的检索语法适配ES的查询规则。所以首先我们要把前端传过来的数据构造成ES搜索条件。1.2 处理执行ES搜索我们的处理就是实现商品的搜索。ES实现商品搜索通过注入ElasticsearchTemplate调用search方法传入构造好的ES查询条件指定映射实体GoodsES即可完成ES数据查询。1.3 出参封装返回前端的完整数据这是整个接口的核心也是区别于普通查询的关键。ES原始查询结果不能直接返回前端需要二次封装对应两个核心需求1、分页商品数据将ES查询的原始数据封装为Page分页对象提供商品列表、总条数、页码等用于前端渲染商品列表2、搜索聚合面板数据遍历所有搜索结果聚合去重品牌、品类、规格数据生成筛选面板同时回显用户的搜索参数保证前端搜索条件不丢失。二、核心代码流程总览// 搜索产品 Override public GoodsSearchResult search(GoodsSearchParam goodsSearchParam) { // 1.构造ES搜索条件 // 2.搜索 // 3.将查询结果封装为Page对象 // 4.封装结果对象 // 4.1 查询结果 // 4.2 查询参数 // 4.3 查询面板 return null; }核心复盘小结1、1、2步是内部查询过程只负责和ES交互无对外返回数据2、3、4步是最终出参核心所有给前端展示的列表、分页、筛选框、参数回显全部来自这两步也是搜索功能的业务核心。