谷粒商城高级篇商城业务:商品检索

Posted 愿你满腹经纶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谷粒商城高级篇商城业务:商品检索相关的知识,希望对你有一定的参考价值。

谷粒商城笔记合集

分布式基础篇分布式高级篇高可用集群篇
===简介&环境搭建======Elasticsearch===
项目简介与分布式概念(第一、二章)Elasticsearch:全文检索(第一章)
基础环境搭建(第三章)===商品服务开发===
===整合SpringCloud===商品服务 & 商品上架(第二章)
整合SpringCloud、SpringCloud alibaba(第四、五章)===商城首页开发===
===前端知识===商城业务:首页整合、Nginx 域名访问、性能优化与压力测试 (第三、四、五章)
前端开发基础知识(第六章)缓存与分布式锁(第六章)
===商品服务开发======商城检索开发===
商品服务开发:基础概念、三级分类(第七、八章)商城业务:商品检索(第七章)
商品服务开发:品牌管理(第九章)
商品服务开发:属性分组、平台属性(第十、十一章)
商品服务:商品维护(第十二、十三章)
===仓储服务开发===
仓储服务:仓库维护(第十四章)
基础篇总结(第十五章)

七、商城业务 & 商品检索⚠️

7.1 整合页面:Thymeleaf⚠️

  1. 添加本机的域名映射规则并 清除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
    
  2. 引入 Thymeleaf 依赖

    <!-- thymeleaf模板引擎 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    
  3. 检索服务 中关闭 Thymeleaf 缓存application.yaml

    spring:
      thymeleaf:
        cache: false
    
  4. 拷贝检索首页到 检索服务 中:bilimall-search/src/main/resources/templates/index.html

  5. 检索服务 中修改 检索首页 :静态资源路径、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" />
        ...
    
  6. 拷贝静态资源到 nginx 中,修改 nginx 配置文件并重新启动 nginx 服务:F:\\software\\Nginx\\conf\\nginx.conf

    ...
    http 
    	...
        server 
            listen       80;
            server_name  *.bilimall.com;
            ...
        
        ...
    
    
  7. 网关服务 中添加 检索系统 的路由规则: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⚠️

  1. 在检索服务的 pom.xml 中引入dev-tools依赖

    <!-- devtools -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
    
  2. 让页面修改实时生效:CTRL+F9、CTRL+SHIFT+F9

7.3 商城首页(跳转)检索首页

  1. 修改 商城系统 中点击三级分类的跳转地址:F:\\software\\Nginx\\html\\static\\index\\js\\catalogLoader.js

    var cata3link = $("<a href=\\"http://search.bilimall.com/list.html?catalog3Id="+ctg3.id+"\\" 
    

  2. 在 检索服务 中修改首页文件名称,并创建首页控制器:list.html、cn.lzwei.bilimall.search.controller.SearchController

    @Controller
    public class SearchController 
    
        @GetMapping(value = "/","/list.html")
        public String index()
            return "list";
        
    
    
  3. 修改 商城系统 中检索商品的跳转地址: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;
    
    

  4. 在 检索服务 中修改检索页点击商城首页的跳转地址

    <!--头部-->
    <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 不要调用错误

  1. cn.lzwei.bilimall.search.constant.EsConstant

    public class EsConstant 
        //商品索引
        public static final String PRODUCT_INDEX="product";
        //页大小
        public static final int SEARCH_PAGESIZE=12;
    
    
  2. 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";
        
    
    
  3. cn.lzwei.bilimall.search.service.SearchService

    /**
     * 检索业务
     */
    public interface SearchService 
        /**
         * 返回检索的结果
         */
        SearchResultVo search(SearchParamVo searchParamVo);
    
    
  4. cn.lzwei.bilimall.search.service.impl.SearchServiceImpl

    /**
     * 检索业务
     */
    @Service(value = "searchService")
    public class SearchServiceImpl implements SearchService 
    
        @Resource
        RestHighLevelClient restHighLevelClient;
        /**
         * 返回检索的结果
         */以上是关于谷粒商城高级篇商城业务:商品检索的主要内容,如果未能解决你的问题,请参考以下文章

    Day409.商品上架 -谷粒商城

    第五篇商城系统-商品属性管理

    第五篇商城系统-商品属性管理

    谷粒商城高级篇Elasticsearch:全文检索

    谷粒商城--SPU和SKU

    谷粒商城--整合Elasticsearch和商品的上架