商城业务-检索服务

文章目录

  • 前言
  • 一、搭建页面环境
    • 1.1 静态界面搭建
    • 1.2 Nginx 动静分离
    • 1.3 Windows 上传文件
    • 1.4 引入 thymeleaf 依赖
    • 1.5 Nginx 反向代理
    • 1.4 Nginx 配置
    • 1.5 gateway 网关配置
  • 二、调整页面跳转
    • 2.1 引入依赖
    • 2.2 页面跳转
  • 三、检索查询参数模型分析抽取
    • 3.1 检索业务分析
    • 3.2 检索语句构建
  • 四、检索返回结果模型分析抽取
    • 4.1 案例说明
    • 4.2 检索结果模型
  • 五、检索DSL测试
    • 5.1 查询部分
    • 5.2 聚合部分

前言

根据微服务自治理念,我们可以将项目中需要ES检索的业务统一维护在检索微服务模块中。

一、搭建页面环境

SpringBoot项目默认读取静态界面名称要命名为index.html,不然项目读取不到静态资源。

1.1 静态界面搭建

将检索相关的静态界面拷贝到gulimall-search项目中templates目录下,并且将项目路径href和src都改为/static/search/开头,统一路径。
在这里插入图片描述

1.2 Nginx 动静分离

利用Nginx动静分离的特点,我们将静态资源放在服务器中/mydata/nginx/html/static/目录下,当前端发送静态资源请求时,直接到静态资源目录下获取静态资源文件。避免通过gateway进入后端微服务,减轻后端微服务的压力。
在这里插入图片描述

1.以后将所有项目的静态资源都应该放在nginx里面
2.规则:/mydata/nginx/html/static/ 目录下所有请求都由nginx直接返回

1.3 Windows 上传文件

递归创建目录,检索服务相关的静态资源放在该目录下

mkdir -p /mydata/nginx/html/static/search/

win + r 输入如下命令,将本地文件上传到 Linux 指定的目录下

scp E:\gulimall\官方资料\代码\html\搜索页\font.zip root@192.168.57.129:/mydata/nginx/html/static/search/

1.4 引入 thymeleaf 依赖

检索页动态资源index.html复制到gulimall-search微服务下的templates目录下。pom.xml引入thymeleaf和devtools 依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

将src=" 和href="的资源引用,全局替换为如下地址:

src="/static/search
href="/static/search

1.5 Nginx 反向代理

在这里插入图片描述

1.4 Nginx 配置

将gulimall.com 和*.gulimall.com的域名都转发给Nginx网关

server {
    listen       80;
    server_name  gulimall.com *.gulimall.com;
    
    #charset koi8-r;
    #access_log  /var/log/nginx/log/host.access.log  main;
    location /static/ {
         root  /usr/share/nginx/html;
    }

    location / {
          proxy_set_header Host $host;
          proxy_pass http://gulimall;
    }
    #error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

1.5 gateway 网关配置

spring:
  cloud:
    gateway:
      routes:
        - id: gulimall_search_route
          uri: lb://gulimall-search
          predicates:
            - Host=search.gulimall.com

访问search.gulimall.com,能够转发到静态检索页

在这里插入图片描述

二、调整页面跳转

2.1 引入依赖

关闭thymeleaf缓存

spring.thymeleaf.cache=false

引入devtools热加载

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>

点击谷粒商城能够跳转到gulimall.com首页

在这里插入图片描述

将地址改为http://gulimall.com

在这里插入图片描述

2.2 页面跳转

  1. 首页输入检索关键字,能够跳转到检索服务;
  2. 通过商品三级分类,能够跳转到检索服务;
    在这里插入图片描述

关键代码

<script type="text/javascript">
  function search() {
      var keyword=$("#searchText").val()
      window.location.href="http://search.gulimall.com/list.html?keyword="+keyword;
  }
</script>

三、检索查询参数模型分析抽取

3.1 检索业务分析

商品检索三个入口:
1.选择分类进入商品检索
在这里插入图片描述
2.输入检索关键字展示检索页
在这里插入图片描述
3.选择筛选条件进入
在这里插入图片描述

检索条件&排序条件:

  • 全文检索:skuTitle
  • 排序:saleCount、hotScore、skuPrice
  • 过滤:hasStock、skuPrice区间、brandId、catalogId、attrs
  • 聚合:attrs

完整的url参数,具体操作可参考京东搜索界面:

  • keyword=小米&sort=saleCount_desc/asc&hasStock=0/1&skuPrice=400_1900&brandId=1 &catalogId=1&attrs=1_3G:4G:5G&attrs=2_骁龙845&attrs=4_高清屏

3.2 检索语句构建

@Data
public class SearchParam {
    /**
     * 页面传递过来的全文匹配关键字
     */
    private String keyword;

    /**
     * 三级分类id
     */
    private Long catalog3Id;

    /**
     * 排序条件
     * sort=saleCount_asc/desc
     * sort=skuPrice_asc/desc
     * sort=hotScore_asc/desc
     */
    private String sort;

    /**
     * 好多的过滤条件
     * hasStock(是否有货)、skuPrice区间、brandId、catalog3Id、attrs
     * hasStock=0/1
     * skuPrice=1_500/_500/500_
     * brandId=1
     * attrs=2_5寸;6寸
     */
    /**
     * 是否只显示有货
     */
    private Integer hasStock;

    /**
     * 价格区间查询
     */
    private String skuPrice;

    /**
     * 按照品牌进行查询,可以多选
     */
    private List<Long> brandId;

    /**
     * 按照属性进行筛选
     */
    private List<String> attrs;

    /**
     * 页码
     */
    private Integer pageNum = 1;

    /**
     * 原生的所有查询条件
     */
    private String _queryString;
}

四、检索返回结果模型分析抽取

4.1 案例说明

以京东商城为例,当我们输入小米点击搜索时,可以检索出品牌名及图片,分类,商品属性名,属性值以及分页数据等小米的信息。

在这里插入图片描述

而这些数据是我们需要从ES中根据前端请求数据查询后返回给前端。

4.2 检索结果模型

@Data
public class SearchResult {
    /**
     * 查询到的所有商品信息
     */
    private List<SkuEsModel> products;

    /**
     * 以下是分页信息
     */
    private Integer pageNum;//当前页码
    private Long total;//总记录数
    private Integer totalPages;//总页码
    private List<Integer> pageNavs;

    /**
     * 当前查询到的结果,所有涉及到的品牌
     */
    private List<BrandVo> brands;
    /**
     * 当前查询到的结果,所有涉及到的所有分类
     */
    private List<CatalogVo> catalogs;
    /**
     * 当前查询到的结果,所有涉及到的所有属性
     */
    private List<AttrVo> attrs;

    /**
     * 面包屑导航数据
     */
    private List<NavVo> navs = new ArrayList<>();
    private List<Long> attrIds = new ArrayList<>();

    @Data
    public static class NavVo{
        private String navName;
        private String navValue;
        private String link;
    }

    @Data
    public static class BrandVo{
        private Long brandId;
        private String brandName;
        private String brandImg;
    }

    @Data
    public static class CatalogVo{
        private Long catalogId;
        private String catalogName;
    }

    @Data
    public static class AttrVo{
        private Long attrId;
        private String attrName;
        private List<String> attrValue;
    }
}

五、检索DSL测试

5.1 查询部分

5.2 聚合部分

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/507651.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Spring源码分析】透过源码看透Spring事务

阅读此需阅读下面这些博客先【Spring源码分析】Bean的元数据和一些Spring的工具【Spring源码分析】BeanFactory系列接口解读【Spring源码分析】执行流程之非懒加载单例Bean的实例化逻辑【Spring源码分析】从源码角度去熟悉依赖注入&#xff08;一&#xff09;【Spring源码分析】…

Java程序运行的问题——异常

什么是异常? Java程序在运行时出现的问题就叫异常 jdk中将异常一新封装成了一个个的类&#xff0c;当出现问题时&#xff0c;就会创建异常对象&#xff0c;抛出异常信息&#xff08;问题原因、位置&#xff09; 1.异常 1.1的继承体系 Throwable 是所有错误&#xff08;erro…

关于OpenFeign的返回类型包装问题

在一天夜里。我在使用feign的调用时&#xff0c;突然出现了一点点问题。 就是对于feign类型的包装问题。产生了疑问。 在后来&#xff0c;也就是今天。在网上取取经。看到了一个答案。说&#xff1a;feign的调用会有一个编码器和解码器。 使用feign的解码器。他的原理也很简…

NineAi3.5 –支持GPT绘图,语音播报,联网访问,上下文关联,语音模式

NineAi3.5 –支持GPT绘图&#xff0c;语音播报&#xff0c;联网访问&#xff0c;上下文关联&#xff0c;语音模式 基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c; 还能根据聊天的上下文进行互动&…

热门IT【视频教程】-华为/思科/红帽/oracle

华为认证 网络工程师-入门基础课&#xff1a;华为HCIA认证课程介绍-CSDN博客 网络工程师进阶课&#xff1a;华为HCIP认证课程介绍-CSDN博客 职场进阶&#xff0c;踏上高峰——HCIE-Datacom认证-CSDN博客 华为HCIA试听课程 &#xff1a; 超级实用&#xff0c;华为VRP系统文件…

4核8G服务器租用优惠价格418元一年,可买3年

京东云4C8G云服务器优惠价格418元1年、1899元三年&#xff0c;配置为&#xff1a;轻量云主机4C8G-180G SSD系统盘-5M带宽-500G月流量&#xff0c;京东云主机优惠活动 atengyun.com/go/jd 可以查看京东云服务器详细配置和精准报价单&#xff0c;活动打开如下图&#xff1a; 京东…

【Go】十四、封装、继承

文章目录 1、封装2、继承3、继承的注意点 1、封装 隐藏实现细节保证数据安全&#xff08;控制变量或方法的访问范围&#xff0c;private&#xff09; Go中实现封装&#xff1a; 结构体、字段的首字母小写&#xff08;Java的private&#xff09;提供一个工厂模式函数&#xf…

SpringBoot+uniApp宠物领养小程序系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.保存宠物信息代码2.提交订单信息代码3.查询评论信息代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBootuniApp框架开发的宠物领养微信小程序系统。…

数据可视化-ECharts Html项目实战(9)

在之前的文章中&#xff0c;我们学习了如何在ECharts中编写气泡图&#xff0c;词云图。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 数据可视化-ECharts Ht…

vue 文件下载

1.返回路径下载 注: 针对一些浏览器无法识别的文件格式&#xff08;如pdf、xls、ppt&#xff09;。可以直接在地址栏上输入URL即可触发浏览器的下载功能。 情况1 //地址栏输入文件URLwindow.location.href URLwindow.open(URL) 注:该方式将下载逻辑放在后端处理&#xff0c…

面试时如何回答接口测试怎么进行

一、什么是接口测试 接口测试顾名思义就是对测试系统组件间接口的一种测试&#xff0c;接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 …

权限提升-Linux系统权限提升篇VulnhubCapability能力LD_Preload加载数据库等

知识点 1、Web或用户到Linux-数据库类型 2、Web或用户到Linux-Capability能力 3、普通用户到Linux-LD_Preload加载so配合sudo 章节点&#xff1a; 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 基础点 0、为什么我们要学习权限…

Python接口自动化 —— 什么是接口测试、为什么要做接口测试?

简介 上一篇和大家一起科普扫盲接口后&#xff0c;知道什么是接口&#xff0c;接口类型等&#xff0c;对其有了大致了解之后&#xff0c;我们就回到主题-接口测试。 什么是接口测试 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各…

C语言-冒泡排序算法

题目描述 设计一个程序&#xff0c;实现冒泡排序算法&#xff0c;并输出{9,8,7,6,5,4,3,2,1,0} 的排序过程。 输出 每个排序过程输出一行&#xff0c;直到排序完成。 样例输出 Expected 9 8 7 6 5 4 3 2 1 0 0 9 8 7 6 5 4 3 2 1 0 1 9 …

HDLbits 刷题 -- Always if

学习&#xff1a; An if statement usually creates a 2-to-1 multiplexer, selecting one input if the condition is true, and the other input if the condition is false. always (*) beginif (condition) beginout x;endelse beginout y;end end This is equivalent …

衍生品交易概况

场内 场外 交易台架构 报价、交易、研究、程序个股、股指Flow、Exotic线性、非线性 对冲管理 管理风险敞口 做好情景分析 尊重市场选择 及时调整策略 理解头寸 善于学习 场外衍生品交易员的一天 盘前 回顾市场、决定今天总体方向处理隔夜敞口 盘中 处理客户询价…

关于 HEAP CORRUPTION DETECTED:after Normal block 错误的原因及解析

目录 一、HEAP CORRUPTION DETECTED:after Normal block 出现的报错情况&#xff1a; 二、问题原因&#xff08;重要&#xff09;&#xff1a; 三、举例 1.错误代码如下&#xff1a; 2.错误原因及分析&#xff08;重要&#xff09;&#xff1a; 3.解决方法 ​编辑 4.正…

两数之和-考察哈希表的运用

题目 给定一个整数数组 n u m s nums nums和一个整数目标值 t a r g e t target target&#xff0c;请你在该数组中找出和为目标值 t a r g e t target target的那 两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同…

计算机网络数据链路层知识总结

物理层知识总结传送门 计算机网络物理层知识点总结-CSDN博客 功能 功能概述 一些基本概念 结点:主机、路由器链路﹔网络中两个结点之间的物理通道&#xff0c;链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路。数据链路︰网络中两个结点之间的逻辑通道&a…