上一篇博客提到,REST Client的方式整合的项目实现复杂的查询比较麻烦,实现的方法是需要我们自己根据ES的语法写出符合语法的bean来,然后把这个bean发送http请求给服务端,这种方法也是我以前参与的一个项目的做法。但是ES本身是提供了java操作的api的,我们直接调用具体的类就能实现而不需要自己创建bean了。
上一篇博客只是实现了ES单节点根据id来实现简单的增删改查,上一篇博客的地址:SpringBoot整合ES(REST Client方式)并实现简单的增删改查
接下来的是ES多节点并实现复杂的通过条件查询并分页
集成准备工作
首先还是依赖
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.5.1</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.5.1</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.5.1</version>
<scope>compile</scope>
</dependency>
建议选用ES7以上的版本,因为ES7版本相对于老版本有较大改动,比如不支持索引类型,所有的索引类型都默认为_doc类型,还有不支持TransportClient等等。7.5.1是我从docker里面搜索到的最新的官方版本。
PS:客户端和服务端的版本需要一样,不然接下来的查询会报语法错误(如果是自己写的bean则能实现向下兼容,这个不行)
YML文件
server:
port: 8080
swagger:
enable: true
title: ElasticSearch-demo
description:
serviceUrl: http://localhost:8080/
version: 1.0.0
controllers: com.example.es.controller
elasticsearch:
user:
password:
host: 192.168.145.128:9200,192.168.145.129:9200,192.168.145.130:9200
这里的swagger是用来进行测试用的,然后集群ip配置以","符号区分
ES客户端 的构建
代码如下
@Slf4j
@Configuration
public class ESRestClient {
private static final int ADDRESS_LENGTH = 2;
private static final String HTTP_SCHEME = "http";
@Value("${elasticsearch.host}")
String ipAddress;
@Value("${elasticsearch.user}")
private String userName;
@Value("${elasticsearch.password}")
private String password;
@Bean
public RestClientBuilder restClientBuilder() {
String[] split = ipAddress.split(",");
HttpHost[] hosts = Arrays.stream(split)
.map(this::makeHttpHost)
.filter(Objects::nonNull)
.toArray(HttpHost[]::new);
return RestClient.builder(hosts);
}
@Bean(name = "highLevelClient")
public RestHighLevelClient highLevelClient(@Autowired RestClientBuilder restClientBuilder){
//配置身份验证
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName, password));
restClientBuilder.setHttpClientConfigCallback(
httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
//设置连接超时和套接字超时
restClientBuilder.setRequestConfigCallback(
requestConfigBuilder -> requestConfigBuilder.setSocketTimeout(10000).setConnectTimeout(60000));
//配置HTTP异步请求ES的线程数
restClientBuilder.setHttpClientConfigCallback(
httpAsyncClientBuilder -> httpAsyncClientBuilder.setDefaultIOReactorConfig(
IOReactorConfig.custom().setIoThreadCount(1).build()));
//设置监听器,每次节点失败都可以监听到,可以作额外处理
restClientBuilder.setFailureListener(new RestClient.FailureListener() {
@Overr

这篇博客介绍了如何在SpringBoot项目中使用Rest-High-Level-Client与ElasticSearch进行集成,以实现更复杂的查询操作。相较于上一篇博客中通过REST Client的简单增删改查,本文将详细阐述集成准备工作,包括版本选择和YML配置,以及客户端的构建。接着展示了Service层和Util类的代码实现,用于处理与ES的交互。
3116

被折叠的 条评论
为什么被折叠?



