Spring Boost + Elasticsearch 实现检索查询

需求:对“昵称”进行“全文检索查询”,对“账号”进行“精确查询”。

认识 Elasticsearch 

1. ES 的倒排索引

  1. 正向索引
    1. 对 id 进行检索速度很快。
    2. 对其他字段即使加了索引,只能满足精确查询。
    3. 模糊查询时,逐条数据扫描,判断是否符合条件。速度很慢。
  2. 倒排索引
    1. 词条(Term)+包含词条的所有文档(Document)的id,这种存储形式。

2. ES 与 mysql 的区别

3. ES 的数据结构与表结构

注:id不为long型,而是keyword。即,不参与分词。

4. ES 分词器的种类:

  1. standard
    1. 中文是逐字分词
  2. ik_smart
    1. 粗粒度。
    2. “程序员” = “程序员”
  3. ik_max_word
    1. 细粒度。
    2. “程序员” = “程序员”、“程序”、“员”

5. ES 增删改查:

  1. 指定索引库,对这个索引库进行
    1. 增:PUT
    2. 删:DELETE
    3. 改:PUT,只能新增字段,不能修改旧字段
    4. 查:GET
  2. 指定 id,对这个 id 的文档进行:
    1. 增:POST
    2. 删:DELETE
    3. 改:PUT:替换旧文档,可以实现增+改;POST:指定修改某些字段
    4. 查:GET

6. ES 查询方式:

  1. 全文检索查询
    1. 数据结构:text
    2. 利用分词器对用户输入的内容进行分词,并在倒排查询库中匹配。
    3. match_query:支持一个字段
    4. multi_match_query:支持多个字段,性能不如 match_query。
  2. 精确查询
    1. 数据结构:keyword、数值、日期、boolean
    2. term:精确查询,即等于。
    3. range:只适用于数值、日期。
  3. 其他:地理查询、符合查询等。

配置 Elasticsearch 

  1. 下载 Elasticsearch
    1. Windows10环境下安装Es7_windows安装es7-CSDN博客
    2. 7.x 和 8.x 差距比较大(8.x 版本默认有ssl 认证、用户密码登录,且在 Spring 中的操作差别有点大)。采用版本是7.12.1
    3. 有高、低版本。采用高版本。
    4. 已经不支持 java 访问 ES,而是 java request 请求的方式访问 ES。
  2. 在Spring boot 配置 ES
    1. 在 xml 中引入依赖。且需要在 properties 强制指定 ES 版本为 7.12.1。
  3. 在Spring boot 配置 FastJson
    1. 在 xml 中引入依赖。且需要指定版本为 1.2.68。1.1.x 不支持 LocalDateTime。
  4. 在Spring boot 配置 RabbitMQ
    1. 在 xml 中引入依赖。
    2. 在 yml 中配置 RabbitMQ。

实现 Elasticsearch 

1. 增删改:数据同步

  1. 如果是单体式项目:对数据库进行增删改查时,对ES也进行增删改查
  2. 如果是微服务项目:
    1. 同步调用:
      1. 服务层先操作数据库,再调用更新ES的接口。
      2. 该接口去更新ES。
      3. ES更新完成后,结果返回给接口。
      4. 接口返回给服务层。
      5. 缺点:业务耦合、耗时增加、性能下降。
    2. 异步通知
      1. 服务层操作数据库,再发布消息。
      2. ES监听并更新数据。
      3. 优点:低耦合。缺点:依赖于MQ的可靠性。
    3. 监听binlog:
      1. 服务层操作数据库。
      2. 数据库把操作记录到binlog。
      3. canal这个中间件去监听binlog,通知ES。
      4. ES更新数据。
      5. 优点:完全解除耦合度。缺点:依赖于中间件canal和mysql。mysql压力增大。

异步通知的操作:

  1. 发送MQ:
    1. 采用topic交换机。
    2. 当进行新增和修改时,发送 id 给交换机,声明“新增”的路由键(routing key)。
    3. 当进行删除时,发送 id 给交换机,并声明“删除”的路由键(routing key)。
      1. 注:不发送整个数据,而是数据的 id,以减少信息传输的数据量。
  2. 监听MQ:
    1. 监听“新增”队列的监听器:对 ES 发送新增请求。
    2. 监听“删除”队列的监听器:对 ES 发送删除请求。

单体式项目:

示例,增的同步代码,在 Controller 层:

//    增@PostMapping()public User save(@RequestBody User user) throws IOException {
//        保存到mysqluserService.save(user);
//        保存到mysql后,id已经有了,可以直接插入到ESesService.AddDocument(user);return user;}

 注:前端发来的数据 user 无 id,通过Mybatis Plus 插入到 mysql 数据库后 user 有 id,可以直接插入到 ES(不需要从 mysql 数据库查询得到 user 数据,再插入 ES)。

2. 查询 + 分页

示例,对“昵称”进行全文检索查询:

1. 创建一个配置类,注入一个 bean 方法,把向 ES 发送请求的 client 注入 IOC。

@Configuration
public class EsConfig {@Beanpublic RestHighLevelClient clien(){return new RestHighLevelClient(RestClient.builder(HttpHost.create("http://localhost:9200")));}
}

2. POJO 中封装三个类:

收到前端的类 EsPageParams

@Data
public class EsPageParams {private String key;private Integer page;private Integer size;
}

发给前端的类 EsPageResult 

@Data
@NoArgsConstructor
@AllArgsConstructor
public class EsPageResult {private Long total;private List<User> users;
}

数据库的类 User 

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {@TableId(type = IdType.AUTO)private Long id; //IDprivate String username; //用户名private String password; //密码private String niCheng; //姓名private Integer gender;private String location;private String txImageName;@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;
}

(如果 ES 和 mysql 数据库不一致,还需要一个 ES 类) 

3. Controller 层:接受请求,发送给 Service 层。

4. Service 层:对 user 索引表的 niCheng 字段进行检索,检索方式是倒排索引。最终结果返回给 Controller 层。

@Service
public class EsService {@Autowiredprivate RestHighLevelClient client;@Autowiredprivate UserService userService;public EsPageResult search(EsPageParams esPageParams) throws IOException {
//        1.准备requestSearchRequest request = new SearchRequest("user");
//        2. 准备DSLString key = esPageParams.getKey();request.source().query(QueryBuilders.matchQuery("niCheng",key));int page = esPageParams.getPage();int size = esPageParams.getSize();request.source().from((page - 1) * size).size(size);
//        3. 发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//        4.解析响应return handleResponse(response);}private EsPageResult handleResponse(SearchResponse response){SearchHits searchHits = response.getHits();long total = searchHits.getTotalHits().value;System.out.println("共搜索到"+total+"条数据");SearchHit[] hits = searchHits.getHits();List<User> users = new ArrayList<>();for(SearchHit hit : hits){String json = hit.getSourceAsString();User user = JSON.parseObject(json, User.class);users.add(user);}return new EsPageResult(total, users);}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vscode ssh远程连接服务器,一直正在下载vscode服务器的解决办法

前言 为方便描述&#xff0c;在本教程中&#xff0c;发起远程连接的叫“主机”&#xff0c;被远程连接的叫“服务器”。 正文 如果主机是首次用vscode远程连接服务器&#xff0c;会在服务器上自动下载vscode服务器&#xff0c;但有时候因为网络问题&#xff0c;会卡在&#xff…

UE4 相机围绕某点旋转

关卡&#xff08;一个相机CameraActor&#xff0c;一个Cube(名叫Target)&#xff09;&#xff1a; 关卡蓝图里的逻辑(为了大家看得清楚&#xff0c;特意连得很紧凑&#xff0c;也比较乱&#xff0c;不然一张截图放不下)&#xff1a; 只对Yaw 只Pitch: 同样对Roll: 围绕任…

switch语句深讲

一。功能 1.选择&#xff0c;由case N:完成 2.switch语句本身没有分支功能&#xff0c;分支功能由break完成 二。注意 1.switch语句如果不加break&#xff0c;在一次判断成功后会执行下面全部语句并跳过判断 2.switch的参数必须是整形或者是计算结果为整形的表达式,浮点数会…

visionTransformer window平台下报错

错误&#xff1a; KeyError: Transformer/encoderblock_0/MlpBlock_3/Dense_0kernel is not a file in the archive解决方法&#xff1a; 修改这个函数即可&#xff0c;主要原因是Linux系统与window系统路径分隔符不一样导致 def load_from(self, weights, n_block):ROOT f&…

c++使用googletest进行单元测试

googletest进行单元测试 使用Google test进行测试一、单元测试二、使用gmock测试 使用Google test进行测试 使用场景&#xff1a; 在平时写代码中&#xff0c;我们需要测试某个函数是否正确时可以使用Google test使用&#xff0c;当然&#xff0c;我们也可以自己写函数进行验证…

云计算时代:SFP、SFP+、SFP28、QSFP+和QSFP28光纤模块详解

随着数据中心的快速发展和云计算的广泛应用&#xff0c;高速、高效率的光纤网络传输成为关键需求。在众多光纤模块中&#xff0c;SFP、SFP、SFP28、QSFP和QSFP28是最常见的几种类型。本文将为您详细解析这几种光纤模块之间的区别&#xff0c;帮助您更好地了解和选择适合自己需求…

网贷大数据黑名单要多久才能变正常?

网贷大数据黑名单是指个人在网贷平台申请贷款时&#xff0c;因为信用记录较差而被列入黑名单&#xff0c;无法获得贷款或者贷款额度受到限制的情况。网贷大数据黑名单的具体时间因个人信用状况、所属平台政策以及银行审核标准不同而异&#xff0c;一般来说&#xff0c;需要一定…

就业班 第三阶段(nginx) 2401--4.22 day1 nginx1 http+nginx初识+配置+虚拟主机

一、HTTP 介绍 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 HTTP是一个基于TCP/IP通信协议来传递数据&#xff08;HTML 文件…

Centos 5 的yum源

背景 有使用较老的Centos 5 系统内部安装软件无法正常报错&#xff0c;是由于系统叫老yum源存在问题 处理方法 更换下述yum源&#xff0c;可以将其他repo源文件备份移动到其他目录&#xff0c;添加下述源后重新测试 [C5.11-base] nameCentOS-5.11 baseurlhttp://vault.c…

微信小程序实现预约生成二维码

业务需求&#xff1a;点击预约按钮即可生成二维码凭码入校参观~ 一.创建页面 如下是博主自己写的wxml&#xff1a; <swiper indicator-dots indicator-color"white" indicator-active-color"blue" autoplay interval"2000" circular > &…

照片相似性搜索引擎Embed-Photos;赋予大型语言模型(LLMs)视频和音频理解能力;OOTDiffusion的基础上可控制的服装驱动图像合成

✨ 1: Magic Clothing Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目&#xff0c;建立在OOTDiffusion的基础上 Magic Clothing是一个以可控制的服装驱动图像合成为核心的技术项目&#xff0c;建立在OOTDiffusion的基础上。通过使用Magic Clothing&#xf…

c# winform打包

本次采用vs2022打包winform窗体应用&#xff0c;有时应用不需要打包为安装应用&#xff0c;执行一个EXE就运行了 测试了几次&#xff0c;winform 非.net Framework 和控制台程序也是非.net Framework项目能打包这种&#xff0c;后续在研究

Redis入门到通关之数据结构解析-ZipList

文章目录 ☃️概述☃️ZipListEntry☃️Encoding编码☃️ZipList的连锁更新问题☃️总结 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与…

Python与数据库连接

新建表boss create table 创建表 Code import pymysqlcon pymysql.connect(hostlocalhost,\userroot,\password,\port3306,\dbbusiness) cursorcon.cursor() cursor.execute(create table if not exists boss(id int auto_increment primary key,name varchar(20)not null…

c++中的指针

一、指针的基本概念 指针的作用&#xff1a;可以通过指针间接访问内存 内存编号是从0开始记录的&#xff0c;一般采用16进制数字表示。可以利用指针变量保存地址。 二、指针变量的定义和使用 指针变量定义语法&#xff1a; 数据类型 * 变量名 #include<iostream> u…

穿越物联网的迷雾:深入理解MQTT协议

目录标题 1、MQTT简介核心特性 2、MQTT的工作原理通信过程 3、MQTT的消息质量&#xff08;QoS&#xff09;4、安全机制5、实践应用环境准备示例项目发布者客户端订阅者客户端 6、最佳实践7、结论8、参考资料 在物联网&#xff08;IoT&#xff09;的海洋中&#xff0c;数据像水流…

mysql的约束和表关系

根据查询的结果&#xff0c;复制出一个新表 create table newTable AS select * from oldTable; create table newPeople AS select * from day2_test.people; 约束 引入&#xff1a;如果某一列如id列&#xff0c;有重复的数据&#xff0c;无法准确定位&#xff0c;有的列有空…

Jenkins CI/CD 持续集成专题一 Jenkins的安装和配置

一 jenkins 官方教程 安装Jenkins 二 安装 2.1 安装方式一 通过安装包的package方式安装 第一步下载链接&#xff1a; Download the latest package 第二步操作方式&#xff1a;打开包并按照说明操作即可安装 2.2 安装方式二 brew安装 第一 安装最新版本jenkins brew in…

vulfocus靶场名称: apache-cve_2021_41773/apache-cve_2021_42013

Apache HTTP Server 2.4.49、2.4.50版本对路径规范化所做的更改中存在一个路径穿越漏洞&#xff0c;攻击者可利用该漏洞读取到Web目录外的其他文件&#xff0c;如系统配置文件、网站源码等&#xff0c;甚至在特定情况下&#xff0c;攻击者可构造恶意请求执行命令&#xff0c;控…

路由重分布的概念与配置

路由重分布的概念 l 路由重分布是指连接不同路由域&#xff08;自治系统&#xff09;的边界路由器&#xff0c;它在路由协议之间交换和通告路由信息 从一种协议&#xff08;含静态/直连路由&#xff09;到另一种协议 同一种协议的多个实例 路由重分布的背景 网络出口位置…