十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

技术派中ES集成的实现姿势

技术派中ES集成的实现姿势 之前我们已经学习了 MySQL 同步 ES 的技术选型然后也教大家如何将 MySQL 数据同步到 ES。这篇文章属于该系列的第三篇也是最后一篇即在技术派项目中实现 ES 查询功能。前两篇文章文末有链接不 BB上文章目录01 背景在 SpringBoot 整合 ES 中有两种常见方法一种是 ElasticsearchRestTemplate另一种是 RestHighLevelClient。ElasticsearchRestTemplate 是 ES 基于 Spring 集成用法但是用法比较单一有些复杂查询无法完成另一种 RestHighLevelClient 是 ES 原生客户端适合各种场景查询。综合考虑下来技术派采用后者 ES 原生客户端 RestHighLevelClient。02 构造客户端2.1 引入依赖在 paicoding-service 模块中的 pom 文件中引入 es 和 es-client 相关依赖。!--引入es-high-level-client相关依赖 start-- dependency groupIdorg.elasticsearch/groupId artifactIdelasticsearch/artifactId version6.8.2/version /dependency dependency groupIdorg.elasticsearch.client/groupId artifactIdelasticsearch-rest-client/artifactId version6.8.2/version /dependency dependency groupIdorg.elasticsearch.client/groupId artifactIdelasticsearch-rest-high-level-client/artifactId version6.8.2/version /dependency2.2 配置文件在 paicoding-web 模块中 src-main-resource-env-dev-application-dal.yml 中配置 ES 相关配置配置如下所示# elasticsearch配置 elasticsearch: # 是否开启ES本地启动如果没有安装ES可以设置为false关闭ES open: true # es集群名称 clusterName: elasticsearch hosts: 127.0.0.1:9200 userName: elastic password: elastic # es 请求方式 scheme: http # es 连接超时时间 connectTimeOut: 1000 # es socket 连接超时时间 socketTimeOut: 30000 # es 请求超时时间 connectionRequestTimeOut: 500 # es 最大连接数 maxConnectNum: 100 # es 每个路由的最大连接数 maxConnectNumPerRoute: 100注意 yml 格式千万别出错。配置的具体介绍我就不再重复介绍了在 yml 的注解中已经详细的标注了请小伙伴们详细看看哦。2.3 配置类配置类其实也就是交由 Spring 去创建 RestHighLevelClient 客户端配置类代码如下所示package com.github.paicoding.forum.service.config.es; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.impl.client.BasicCredentialsProvider; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import org.elasticsearch.client.RestHighLevelClient; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * es配置类 * * author ygl * since 2023-05-25 **/ Slf4j Data Configuration ConfigurationProperties(prefix elasticsearch) public class ElasticsearchConfig { // 是否开启ES private Boolean open; // es host ip 地址集群 private String hosts; // es用户名 private String userName; // es密码 private String password; // es 请求方式 private String scheme; // es集群名称 private String clusterName; // es 连接超时时间 private int connectTimeOut; // es socket 连接超时时间 private int socketTimeOut; // es 请求超时时间 private int connectionRequestTimeOut; // es 最大连接数 private int maxConnectNum; // es 每个路由的最大连接数 private int maxConnectNumPerRoute; /** * 如果Bean没有指定bean的名称那么这个bean的名称就是方法名 */ Bean(name restHighLevelClient) public RestHighLevelClient restHighLevelClient() { // 此处为单节点es String host hosts.split(:)[0]; String port hosts.split(:)[1]; HttpHost httpHost new HttpHost(host, Integer.parseInt(port)); // 构建连接对象 RestClientBuilder builder RestClient.builder(httpHost); // 设置用户名、密码 CredentialsProvider credentialsProvider new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password)); // 连接延时配置 builder.setRequestConfigCallback(requestConfigBuilder - { requestConfigBuilder.setConnectTimeout(connectTimeOut); requestConfigBuilder.setSocketTimeout(socketTimeOut); requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut); return requestConfigBuilder; }); // 连接数配置 builder.setHttpClientConfigCallback(httpClientBuilder - { httpClientBuilder.setMaxConnTotal(maxConnectNum); httpClientBuilder.setMaxConnPerRoute(maxConnectNumPerRoute); httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); return httpClientBuilder; }); return new RestHighLevelClient(builder); } }其实配置类中也就是构造 RestHighLevelClient 客户端。注意是放在 paicoding-service 模块中。注意在 yml 中的 elasticsearch.hosts 中千万不要加 https 前缀只需要 127.0.0.1:9200 即可(我在这里翻车过)否则在配置类中 new HttpHost() 会出错。03 查询 ES在整合之前我先来说下大致逻辑根据查询条件去ES中查询出数据从查询出所有数据中取出 id然后将 id 去 add 进 ids 中拿到 ids 后去 MySQL 数据库中捞数据。这一套流程下来要比根据查询条件进行 like% 值 % 不走索引查询效率性能好的多。然后开始编写实现代码代码实现及过程如下所示04 兼容 MySQL考虑到有的小伙伴没有安装 ES 和 Canal为了让代码能够查询首页时还是走 MySQL 数据库我这边特意做了兼容即使没有安装 ES 等也是可以正常运行。首先我在 yml 中增加了是否开启 ES 值。然后在 Service 层将 open 值注入。最后在代码层面业务层实现。05 代码仓库为了方便大家学习功能演变的过程每个模块都会单独开个分支代码分支、代码 Diff 如下代码分支feature/mysql_es_20230523代码 Diffhttps://github.com/itwanger/paicoding/pull/51/files建议大家先看代码 Diff这样你就知道所有的改动非常便于自己学习。06 总结我们再回顾一下整体执行流程写到这里就结束了是不是满满的干货呢通过这 3 篇文章从原理到实践手把手教你如何将 MySQL 同步到 ES并应用到实际场景中如果你的项目也需要用到该场景基本可以直接照搬。
返回列表