谷粒商城高级篇商城业务:商品检索
Posted 愿你满腹经纶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谷粒商城高级篇商城业务:商品检索相关的知识,希望对你有一定的参考价值。
谷粒商城笔记合集
分布式基础篇 | 分布式高级篇 | 高可用集群篇 |
---|---|---|
===简介&环境搭建=== | ===Elasticsearch=== | |
项目简介与分布式概念(第一、二章) | Elasticsearch:全文检索(第一章) | |
基础环境搭建(第三章) | ===商品服务开发=== | |
===整合SpringCloud=== | 商品服务 & 商品上架(第二章) | |
整合SpringCloud、SpringCloud alibaba(第四、五章) | ===商城首页开发=== | |
===前端知识=== | 商城业务:首页整合、Nginx 域名访问、性能优化与压力测试 (第三、四、五章) | |
前端开发基础知识(第六章) | 缓存与分布式锁(第六章) | |
===商品服务开发=== | ===商城检索开发=== | |
商品服务开发:基础概念、三级分类(第七、八章) | 商城业务:商品检索(第七章) | |
商品服务开发:品牌管理(第九章) | ||
商品服务开发:属性分组、平台属性(第十、十一章) | ||
商品服务:商品维护(第十二、十三章) | ||
===仓储服务开发=== | ||
仓储服务:仓库维护(第十四章) | ||
基础篇总结(第十五章) |
七、商城业务 & 商品检索⚠️
7.1 整合页面:Thymeleaf⚠️
-
添加本机的域名映射规则并 清除DNS缓存 :C:\\Windows\\System32\\drivers\\etc\\hosts
192.168.10.10 bilimall.com 192.168.10.10 search.bilimall.com #清除DNS缓存内容 PS C:\\Users\\ZW L> ipconfig /flushdns Windows IP 配置 已成功刷新 DNS 解析缓存。 #显示DNS缓存内容 PS C:\\Users\\ZW L> ipconfig /displaydns
-
引入 Thymeleaf 依赖
<!-- thymeleaf模板引擎 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
-
在 检索服务 中关闭 Thymeleaf 缓存application.yaml
spring: thymeleaf: cache: false
-
拷贝检索首页到 检索服务 中:bilimall-search/src/main/resources/templates/index.html
-
在 检索服务 中修改 检索首页 :静态资源路径、thymeleaf命名空间、html文件格式等
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <!-- 修改为: --> <link rel="stylesheet" href="/static/search/css/index.css"> <script src="/static/search/js/jquery-1.12.4.js"></script> <img src="/static/search/image/down-@1x.png" /> <img src="/static/search/img/01.png" /> ...
-
拷贝静态资源到 nginx 中,修改 nginx 配置文件并重新启动 nginx 服务:F:\\software\\Nginx\\conf\\nginx.conf
... http ... server listen 80; server_name *.bilimall.com; ... ...
-
在 网关服务 中添加 检索系统 的路由规则:application.yaml
spring: cloud: nacos: discovery: server-addr: 114.132.162.129:8848 gateway: routes: - id: bilimall_route uri: lb://bilimall-product predicates: - Host=bilimall.com - id: bilimall_search_route uri: lb://bilimall-search predicates: - Host=search.bilimall.com
7.2 整合 dev-tools⚠️
-
在检索服务的 pom.xml 中引入dev-tools依赖
<!-- devtools --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency>
-
让页面修改实时生效:CTRL+F9、CTRL+SHIFT+F9
7.3 商城首页(跳转)检索首页
-
修改 商城系统 中点击三级分类的跳转地址:F:\\software\\Nginx\\html\\static\\index\\js\\catalogLoader.js
var cata3link = $("<a href=\\"http://search.bilimall.com/list.html?catalog3Id="+ctg3.id+"\\"
-
在 检索服务 中修改首页文件名称,并创建首页控制器:list.html、cn.lzwei.bilimall.search.controller.SearchController
@Controller public class SearchController @GetMapping(value = "/","/list.html") public String index() return "list";
-
修改 商城系统 中检索商品的跳转地址:bilimall-product/src/main/resources/templates/index.html
function search() var keyword=$("#searchText").val() window.location.href="http://search.gulimall.com/list.html?keyword="+keyword;
-
在 检索服务 中修改检索页点击商城首页的跳转地址
<!--头部--> <div class="header_head"> <div class="header_head_box"> <b class="header_head_p"> <div style="overflow: hidden"> <a href="http://bilimall.com" class="header_head_p_a1" style="width:73px;"> 谷粒商城首页 </a> <!--搜索导航--> <div class="header_sous"> <div class="logo"> <a href="http://bilimall.com">...</a> </div>
7.4 检索业务分析💡
7.4.1 检索条件VO分析💡
打个比例吧 你肯定上过京东、淘宝买过东西吧? 那么你想要购买什么东西,你需要在搜索框中搜索你想要购买的物品,那么系统就会给你响应
我在京东搜索 手机
他会显示出相对应的产品
我们分析可能存在的检索条件,并创建对应的VO类:cn.lzwei.bilimall.search.vo.SearchParamVo
/**
* 封装页面所有可能传递过来的查询条件
*/
@Data
public class SearchParamVo
//页面传递过来的全文匹配关键字
private String keyword;
//三级分类id
private Long catalog3Id;
/**
* sort=saleCout_asc/desc
* sort=skuPrice_asc/desc
* sort=hotScore_asc/desc
*/
//排序条件
private String sort;
/**
* hasStock=0/1
* skuPrice=1_500/_500/500_
* brandId=1
* attrs=1_红色:黑色&attrs=2_5寸:8寸&
*/
private Integer hasStock;//是否有库存:1-有库存、0-无库存
private String skuPrice;//价格区间查询
private List<Long> brandId;//按照品牌进行查询,可以多选:&1_5寸:8寸&
private List<String> attrs;//按照属性进行筛选
private Integer pageNum = 1;//页码
7.4.2 检索结果VO分析💡
那么返回的数据我们是不是也要创建一个 VO 用来返回页面的数据?借鉴京东的实例来做参考
抽取出结果VO类:cn.lzwei.bilimall.search.vo.SearchResultVo
/**
* 检索结果返回
*/
@Data
public class SearchResultVo
/**
* 查询到所有商品的商品信息
*/
private List<SpuUpTo> products;
/**
* 以下是分页信息
*/
private Integer pageNum;//当前页码
private Long total;//总共记录数
private Integer totalPages;//总页码
/**
* 当前查询到的结果,所有设计的品牌
*/
private List<BrandVo> brands;
/**
* 当前查询结果,所有涉及到的分类
*/
private List<CatalogVo> catalogs;
/**
* 当前查询到的结果,所有涉及到的所有属性
*/
private List<AttrVo> attrs;
/**
* 页码
*/
private List<Integer> pageNavs;
//==================以上是要返回给页面的所有信息
/**
* 品牌信息
*/
@Data
public static class BrandVo
private Long brandId; //品牌id
private String brandName; //品牌名字
private String brandImg; //品牌图片
/**
* 分类信息
*/
@Data
public static class CatalogVo
private Long catalogId; //分类id
private String CatalogName; //品牌名字
/**
* 属性信息
*/
@Data
public static class AttrVo
private Long attrId; //属性id
private String attrName; //属性名字
private List<String> attrValue; //属性值
7.4.3 检索语句分析:DSL
那么这个 DSL 编写我们就在 Kibana 中测试
#GET gulimall_product/_search
"query":
"bool":
"must": [
"match":
"skuTitle": "华为"
],
"filter": [
"term":
"catalogId": "225"
,
"terms":
"brandId": [
"7",
"8",
"9"
]
,
"nested":
"path": "attrs",
"query":
"bool":
"must": [
"term":
"attrs.attrId":
"value": "3"
,
"terms":
"attrs.attrValue": [
"2019"
]
]
,
"term":
"hasStock":
"value": "true"
,
"range":
"skuPrice":
"gte": 0,
"lte": 7000
]
,
"sort": [
"skuPrice":
"order": "desc"
],
"from": 0,
"size": 5,
"highlight":
"fields": "skuTitle": ,
"pre_tags": "<b style=color:red>",
"post_tags": "</b>"
,
"aggs":
"brand_agg":
"terms":
"field": "brandId",
"size": 10
,
"aggs":
"brand_name_agg":
"terms":
"field": "brandName",
"size": 1
,
"brand_img_agg":
"terms":
"field": "brandImg",
"size": 1
,
"catalog_agg":
"terms":
"field": "catalogId",
"size": 10
,
"aggs":
"catalog_name_agg":
"terms":
"field": "catalogName",
"size": 10
,
"attr_agg":
"nested":
"path": "attrs"
,
"aggs":
"attr_id_agg":
"terms":
"field": "attrs.attrId",
"size": 10
,
"aggs":
"attr_name_agg":
"terms":
"field": "attrs.attrName",
"size": 10
,
"attr_value_agg":
"terms":
"field": "attrs.attrValue",
"size": 10
7.4.4 /product/_mapping
#PUT product
"mappings":
"properties":
"skuId":
"type":"long"
,
"spuId":
"type":"keyword"
,
"skuTitle":
"type":"text",
"analyzer": "ik_smart"
,
"skuPrice":
"type":"keyword"
,
"skuImg":
"type":"text",
"analyzer": "ik_smart"
,
"saleCount":
"type":"long"
,
"hasStock":
"type":"boolean"
,
"hotScore":
"type":"long"
,
"brandId":
"type":"long"
,
"catelogId":
"type":"long"
,
"brandName":
"type":"keyword"
,
"brandImg":
"type":"keyword"
,
"catalogName":
"type":"keyword"
,
"attrs":
"type":"nested",
"properties":
"attrId":
"type":"long"
,
"attrName":
"type":"keyword"
,
"attrValue":
"type":"keyword"
7.5 API:构建检索请求条件💡
7.5.1 代码编写
代码对照着 7.4.3小节 生成的DSL检索条件进行编写
term 和 terms 不要调用错误
-
cn.lzwei.bilimall.search.constant.EsConstant
public class EsConstant //商品索引 public static final String PRODUCT_INDEX="product"; //页大小 public static final int SEARCH_PAGESIZE=12;
-
cn.lzwei.bilimall.search.controller.SearchController
/** * 检索系统首页控制器 */ @Controller public class SearchController @Resource SearchService searchService; @GetMapping(value = "/","/list.html") public String index(SearchParamVo searchParamVo, Model model) //在返回页面中设置检索结果 SearchResultVo result=searchService.search(searchParamVo); model.addAttribute("result",result); return "list";
-
cn.lzwei.bilimall.search.service.SearchService
/** * 检索业务 */ public interface SearchService /** * 返回检索的结果 */ SearchResultVo search(SearchParamVo searchParamVo);
-
cn.lzwei.bilimall.search.service.impl.SearchServiceImpl
/** * 检索业务 */ @Service(value = "searchService") public class SearchServiceImpl implements SearchService @Resource RestHighLevelClient restHighLevelClient; /** * 返回检索的结果 */以上是关于谷粒商城高级篇商城业务:商品检索的主要内容,如果未能解决你的问题,请参考以下文章