【Project】云商城 - 检索服务
本文将详细介绍云商城的检索服务。云商城完整项目介绍见文章 【Project】云商城
检索服务
检索服务 mall-search
负责实现的功能:
- 商品上架:在后台管理系统中【上架】某个商品时,将其 SPU 传给商品服务。商品服务会查询出该 SPU 所包含的所有 SKU 的详细信息并封装成一个个
SkuEsModel
,然后远程调用检索服务将这些 SKU 信息保存到 ElasticSearch 中,用于在商城页面快速查询出某个 SKU 的详细信息 - 检索 SKU:根据前端传来的关键词等参数对商品(SKU)进行检索。
商品上架
在开始编写商城业务之前,首先我们需要先考虑商城内应该出现哪些数据:只有在后台管理系统选择 【上架】 的商品才会出现在商城首页,同时这些商品也将被存储到 ElatiscSearch 中,这样就能被快速检索到。后台管理系统界面:
- 首先定义要存储到 ES 中的模型类
SkuEsModel
,将其存放在mall-common
微服务的to
包下,包含的具体属性:
1 |
|
attrs 属性是所有 spu 共享一份的,该 spu 下的所有 sku 都有相同的值。这种存储方法虽然造成了大量的 attrs 信息冗余,但是其却节省了大量的查询时间,否则每个 sku 还要再去单独检索其对应的 spu 的 attrs,无疑会浪费很多时间,在高并发下会发生严重阻塞。所以选择这种冗余方式存储 attrs,虽然浪费了空间,但是节省了时间
- 点击上架后,将发送该商品的
spuId
到商品服务。商品服务响应该请求后将根据该值查询得到下面的其他信息。具体逻辑见SpuInfoServiceImpl
:
1 | /** |
- 检索服务
mall-search
将传来的SkuEsModel
数据保存到 ElasticSearch 中:
ElasticSaveController
代码:
1 | /** |
ProductSaveService
代码:
1 | /** |
其中,向 ES 中创建的 product 索引的语句为:
1 | PUT product |
注意 attrs
字段的类型为 nested
,表示嵌入式字段,不会被扁平化处理。
检索 SKU
前端页面中用户可以用来进行检索的条件:
商城首页在点击某个分类后即会向检索服务发送请求,查询选中的分类(keyword
关键字)所包含的所有 SKU 信息:
数据模型设计
我们需要根据这些条件构造出搜索条件实体类 SearchParam
,该对象中的每个属性都对应了前端传来的查询参数:
1 | /** |
同时我们还需要为检索结果设计一个 VO 类 SearchResult
,该类负责保存检索到的所有商品信息 SkuEsModel
(具体定义见商品上架),并且保存查询结果所涉及到的品牌、商品分类以及商品属性等信息。这些信息将返回给前端进行展示,这样前端就可以根据用户的检索条件显示出符合该条件的所有产品以及其所涉及到的品牌、商品分类以及商品属性等信息。
查询结果实体类 SearchResult
:
1 | /** |
检索 DSL 语句
构建出 DSL 语句,要包含以下几个部分:
1 | GET product/_search |
DSL 语句示例:
1 | GET product/_search |
业务代码
整体逻辑:
- 前端发送用户选择的检索条件
- Spring MVC 将前端发来的请求中的查询参数自动封装到
SearchParam
对象中 - Service 层负责根据
SearchParam
去 ES 中检索出符合的商品数据SkuEsModel
,并将其涉及到的品牌、商品分类以及商品属性等信息封装到SearchResult
中 - Spring MVC 将
SearchResult
放到请求域中转发给检索页search.html
,其进行数据渲染
Controller 层代码:
1 | /** |
Service 层代码:
1 | /** |