1. 关键字搜索
一.需求分析
- 在首页或搜索页输入关键字,点击搜索
二.实现思路
- 后端使用匹配查询和布尔查询
- 前端使用thymeleaf模板渲染
- 前端向后端传递map(因为提交的不仅仅是关键字,还有品牌、规格、分类等信息)
- 后端向前端返回map(因为返回的不仅仅是列表,还有商品分类、品牌和规格列表等数据)
三.集成elasticsearch高级客户端
- qingcheng_service_goods工程pom.xml新增依赖
- qingcheng_service_goods工程新增工厂类
- qingcheng_service_goods工程applicationContext-service.xml新增配置
四.关键字搜索逻辑
- qingcheng_interface工程新增接口 SkuSearchService 服务接口新增方法定义
- qingcheng_service_goods工程新增服务实现类SkuSearchServiceImpl 实现此方法,实现关键字查询
- qingcheng_web_portal工程新增类
WebUtil类是工具类,用于字符集转码
五.模板构建
- qingcheng_web_portal工程新增模板,将search.htm拷贝到WEB-INF下,并进行以下修改
遍历查询结果 - 修改index.html的关键字搜索表单
2. 商品分类过滤
一.需求分析
- 以关键字作为查询条件,查询结果中包含的商品分类,在页面中显示出来
- 点击商品分类,按商品分类对结果进行过滤查询,并且在查询条件列表中添加已经选择的商品分类标签,隐藏搜索面板中的商品分类一行。点击条件标签的“×”,取消该过滤条件
二.实现思路
- 商品分类列表的显示使用聚合查询
- 使用过滤查询
三.商品分类列表
- 修改SkuSearchServiceImpl的search方法,在第一段代码(封装查询请求)的末尾处添加以下代码:
在第二段代码中添加以下代码: - 修改qingcheng_web_portal的search.html 商品分类列表
四.分类过滤查询
- 修改SkuSearchServiceImpl类的search方法,在第一段代码(封装查询请求)中添加如下代码:
- 修改SearchController的search方法,添加以下代码
- 修改changgou_web_search的search.html 商品分类列表
五.取消分类过滤
- 修改SearchController的search方法,添加以下代码
- 修改search.html的条件列表部分
为商品分类的div添加条件 ,判断当查询条件中不存在category时显示商品分类
3. 品牌过滤
一.需求分析
- 根据关键字搜索得到的商品分类列表,按照第一个分类查询该分类下的品牌列表
二.实现思路
- 数据访问层添加方法,根据商品分类名称得到品牌列表
- 在搜索商品的方法中,添加按品牌过滤的逻辑。
三.品牌列表
- BrandMapper接口新增方法定义
- 修改 SkuSearchServiceImpl ,注入BrandMapper
修改search方法,新增代码 - 修改search.html ,展现品牌列表
四.品牌过滤查询
- 修改SkuSearchServiceImpl类的search方法,添加以下代码
- 修改模板
五.取消品牌过滤
- 修改search.html的条件列表部分
- 在品牌列表的div上添加条件
代码优化:修改SkuSearchServiceImpl类的search方法 ,当查询条件中包含品牌信息,则不查询品牌列表
4. 规格过滤
一.需求分析
- 根据关键字搜索得到的商品分类列表,按照第一个分类查询该分类下的规格和规格选项列表
如果用户选择了商品分类,按照选择的商品分类查询该分类下的规格和规格选项列表
点击某规格下的规格选项,按照该规格和规格选项对结果进行过滤。
点击条件标签的“×”,取消该过滤条件
二.实现思路
- 数据访问层添加方法,根据商品分类名称得到规格列表
- 在搜索商品的方法中,添加按规格过滤的逻辑。
三.规格列表
- SpecMapper新增方法定义
- 修改SkuSearchServiceImpl ,引入specMapper
修改search方法,新增代码 - 修改search.html
四.规格过滤查询
- 对于对象类型的查询语法:
前后端约定:所有spec.开头的参数都是规格
修改SkuSearchServiceImpl类的search方法,添加以下代码 - 修改模板
五.取消规格过滤
- 修改search.html 添加条件标签
- 在规格列表的div上添加条件
5. 价格过滤
一.需求分析
- 点击价格区间表现,按价格区间搜索
点击条件标签的“×”,取消该过滤条件
二.实现思路
- 价格区间可以在模板中写成固定的。
- 使用范围查询。
需求:查询价格大于等于10000并且小于等于20000的记录
范围查询的语法如下:
rest高级客户端 :
比较神奇的是,我们可以传递字符串
也是可以查询到结果,它会自动转换类型。
三.价格条件列表
- 修改search.html
四.价格过滤
- 修改SkuSearchServiceImpl类的buildBasicQuery方法,添加代码
五.取消价格过滤
- 修改search.html 添加条件标签
- 在搜索面板的价格一行添加条件
6. 品牌与规格列表缓存
一.需求分析
- 现在我们每次查询时都需要根据商品分类名称读取品牌和规格列表,这样对于数据库造成比较大的访问压力,所以我们需要将品牌和规格列表放入缓存。
二.实现思路
- 方式一:定时预热
写一个定时任务,每天执行一次,查询所有的商品分类的品牌和规格列表,放入缓存
以hash形式存储,以分类名称作为key,以品牌列表和规格列表作为值。
启动时检测缓存中是否存在数据,如果不存在数据则立即执行缓存预热。 - 方式二:随机过期
获取品牌和规格列表查询缓存中是否存在数据,如果缓存中有数据则返回缓存中的数
据,如果没有则查询数据库并放入缓存并设置过期时间,为了避免缓存雪崩,我们将过
期时间设置为一定范围内的随机数。