ES 的更新速度非常快,官方推出的 Java 客户端 elasticsearch-rest-high-level-client,它的代码写法跟 DSL 语句很相似,这里我们就采用这种方式进行演练。
RestHighLevelClient操作7.10.0(一)ElasticSearch 连接配置
一、查询官方文档
使用Restful风格文档,注意选择对应的版本
使用高级客户端
二、Maven 引入相关依赖
- SpringBoot 版本:2.4.1
- ElasticSearch 版本:7.10.0
- lombok: lombok 工具依赖。
- fastjson: 用于将 JSON 转换对象的依赖。
- spring-boot-starter-web: SpringBoot 的 Web 依赖。
- elasticsearch:ElasticSearch: 依赖,需要和 ES 版本保持一致。
- spring-boot-starter-data-elasticsearch: 用于操作 ES 的 Java 客户端。
SpringBoot默认整合的是elasticsearch的6.8.6版本,因此需要修改依赖的版本信息为当前elasticsearch对应的版本 ,即spring-boot-starter-data-elasticsearch的依赖中已经引入了elasticsearch-rest-high-level-client依赖,因此只需要修改相关的版本即可
- commons-lang3:String Utils
- swagger:为后续在线操作文档做准备
pom文件相关配置:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com._520xuzai.es7</groupId>
<artifactId>elasticsearch7</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>elasticsearch7</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<elasticsearch.version>7.10.0</elasticsearch.version>
<swagger.version>1.9.1.RELEASE</swagger.version>
<commons-lang3.version>3.11</commons-lang3.version>
<fastjson.version>1.1.40</fastjson.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot与elasticsearch整合的相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- swagger -->
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
<version>${swagger.version}</version>
</dependency>
<!--String Utils-->
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
三、ElasticSearch 连接配置
1、application.yml 配置文件
相关配置如下:
server:
port: 8080
#spring
spring:
application:
name: springboot-elasticsearch
elasticsearch:
address: 192.168.225.145:9200,192.168.225.145:9201,192.168.225.145:9202
username: elastic
password: 123456
schema: http
connectTimeout: 5000
socketTimeout: 5000
connectionRequestTimeout: 5000
maxConnectNum: 100
maxConnectPerRoute: 100
2、ES 连接参数类
ElasticsearchRuntimeEnvironment.java
读取 application 中的配置信息
package com._520xuzai.es7.conf.esbase;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* \* Created with IntelliJ IDEA.
* \* User: 煦仔
* \* Date: 2020-12-22
* \* Time: 11:01
* \* To change this template use File | Settings | File Templates.
* \* Description: ElasticSearch 配置
* \
*/
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(prefix = "elasticsearch")
@ConditionalOnProperty("elasticsearch.address")
public class ElasticsearchRuntimeEnvironment {
/**
* es连接地址,如果有多个用,隔开
*/
private String address;
/**
* es用户名
*/
private String username;
/**
* es密码
*/
private String password;
/**
* 协议
*/
private String scheme;
/**
* 连接超时时间
*/
private int connectTimeout;
/**
* Socket 连接超时时间
*/
private int socketTimeout;
/**
* 获取连接的超时时间
*/
private int connectionRequestTimeout;
/**
* 最大连接数
*/
private int maxConnectNum;
/**
* 最大路由连接数
*/
private int maxConnectPerRoute;
}
3、初始化RestHighLevelClient对象
package com._520xuzai.es7.conf;
import com._520xuzai.es7.conf.esbase.ElasticsearchRuntimeEnvironment;
import org.apache.commons.lang3.StringUtils;
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.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
/**
* \* Created with IntelliJ IDEA.
* \* User: 煦仔
* \* Date: 2020-12-22
* \* Time: 9:40
* \* To change this template use File | Settings | File Templates.
* \* Description:
* \
*/
@Configuration
public class ElasticsearchConfig {
@Autowired(required = false)
private ElasticsearchRuntimeEnvironment esRuntimeEnvironment;
@Bean
//当前es相关的配置存在则实例化RestHighLevelClient,如果不存在则不实例化RestHighLevelClient
@ConditionalOnBean(value = ElasticsearchRuntimeEnvironment.class)
public RestHighLevelClient restHighLevelClient(){
//es地址,以逗号分隔
String nodes = esRuntimeEnvironment.getAddress();
nodes = nodes.contains("http://") ? nodes.replace("http://","") : nodes;
//es密码
String password = esRuntimeEnvironment.getPassword();
String scheme = esRuntimeEnvironment.getScheme();
List<HttpHost> httpHostList = new ArrayList();
//拆分es地址
for(String address : nodes.split(",")){
int index = address.lastIndexOf(":");
httpHostList.add(new HttpHost(address.substring(0, index),Integer.parseInt(address.substring(index + 1)),scheme));
}
//转换成 HttpHost 数组
HttpHost[] httpHosts = httpHostList.toArray(new HttpHost[httpHostList.size()]);
//构建连接对象
RestClientBuilder builder = RestClient.builder(httpHosts);
//使用账号密码连接
if ( StringUtils.isNotEmpty(password)){
String username = esRuntimeEnvironment.getUsername();
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider .setCredentials(AuthScope.ANY,new UsernamePasswordCredentials(username,password));
builder.setHttpClientConfigCallback(f->f.setDefaultCredentialsProvider(credentialsProvider));
}
// 异步连接延时配置
builder.setRequestConfigCallback(requestConfigBuilder -> {
requestConfigBuilder.setConnectTimeout(esRuntimeEnvironment.getConnectTimeout());
requestConfigBuilder.setSocketTimeout(esRuntimeEnvironment.getSocketTimeout());
requestConfigBuilder.setConnectionRequestTimeout(esRuntimeEnvironment.getConnectionRequestTimeout());
return requestConfigBuilder;
});
// 异步连接数配置
builder.setHttpClientConfigCallback(httpClientBuilder -> {
httpClientBuilder.setMaxConnTotal(esRuntimeEnvironment.getMaxConnectNum());
httpClientBuilder.setMaxConnPerRoute(esRuntimeEnvironment.getMaxConnectPerRoute());
return httpClientBuilder;
});
return new RestHighLevelClient(builder);
}
}
至此ElasticSearch 连接配置已经基本完成。
四、swagger文档
为便于后续操作,我们同时进行了swagger
的相关配置
package com._520xuzai.es7.conf;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* \* Created with IntelliJ IDEA.
* \* User: 煦仔
* \* Date: 2020-12-22
* \* Time: 10:52
* \* To change this template use File | Settings | File Templates.
* \* Description:
* \
*/
@EnableSwagger2
@Configuration
public class Swagger2Config {
//访问地址:http://ip:port/swagger-ui.html
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com._520xuzai.es7"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("搜索Api接口文档")
.version("1.0")
.build();
}
}