引入依赖
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
这里填已经安装好的elasticsearch对应的版本
elasticsearch 配置
@Configuration
public class ElasticSearchConfig {
// 这些属性自己在application.yml中配置
/** 协议 */
@Value("${elasticsearch.schema:http}")
private String schema;
/** elasticsearch地址,未设置集群 */
@Value("${elasticsearch.address}")
private String address;
/** 端口 */
@Value("${elasticsearch.port}")
private String port;
/**
* 自定义的连接设置类
*/
private ElasticsearchRequestConfigCallback configCallback;
@Autowired
public void setConfigCallback(ElasticsearchRequestConfigCallback configCallback) {
this.configCallback = configCallback;
}
// 将ElasticsearchClient注册到spring容器中,方便在其他地方直接注入使用
@Bean
public ElasticsearchClient elasticsearchClient() {
// 构造方法 HttpHost(String hostname, int port, String scheme)
HttpHost httpHost = new HttpHost(address, Integer.parseInt(port), schema);
// 构造方法 RestClientBuilder builder(HttpHost... hosts)
// 连接elasticsearch客户端
RestClient restClient;
restClient = RestClient.builder(httpHost).setRequestConfigCallback(configCallback).build();
// 设置json mapper 映射类
ElasticsearchTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
return new ElasticsearchClient(transport);
}
}
自定义连接的属性值
在RestClient.builder()方法中,RestClient提供了setRequestConfigCallback方法,查看RequestConfigCallback发现是一个接口,我们直接实现这个接口。
public interface RequestConfigCallback {
/**
* Allows to customize the {@link RequestConfig} that will be used with each request.
* It is common to customize the different timeout values through this method without losing any other useful default
* value that the {@link RestClientBuilder} internally sets.
*/
RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder);
}
在这个接口中只有一个方法customizeRequestConfig,意思就是定制request配置,所以通过这个实现这个方法,可以定制我们想要的连接属性。
@Component
public class ElasticsearchRequestConfigCallback implements RestClientBuilder.RequestConfigCallback {
// 这些属性自己在application.yml中配置
/** 连接超时时间 */
@Value("${elasticsearch.connectTimeout:5000}")
private int connectTimeout;
/** Socket 连接超时时间 */
@Value("${elasticsearch.socketTimeout:10000}")
private int socketTimeout;
/** 获取连接的超时时间 */
@Value("${elasticsearch.connectionRequestTimeout:5000}")
private int connectionRequestTimeout;
/** 最大连接数 */
@Value("${elasticsearch.maxConnectNum}")
private int maxConnectNum;
@Override
public RequestConfig.Builder customizeRequestConfig(RequestConfig.Builder requestConfigBuilder) {
// 通过RequestConfig.Builder这个类,我们可以自己设置连接的一些属性,达到定制配置的效果
requestConfigBuilder.setConnectionRequestTimeout(connectTimeout)
.setSocketTimeout(socketTimeout)
.setConnectionRequestTimeout(connectionRequestTimeout)
.setMaxRedirects(maxConnectNum);
return requestConfigBuilder;
}
}
浅看一下RequestConfig.Builder 这个类,发现它已经初始化了所有的属性,我们也可以通过设置来进行修改。
Builder() {
super();
this.staleConnectionCheckEnabled = false;
this.redirectsEnabled = true;
this.maxRedirects = 50;
this.relativeRedirectsAllowed = true;
this.authenticationEnabled = true;
this.connectionRequestTimeout = -1;
this.connectTimeout = -1;
this.socketTimeout = -1;
this.contentCompressionEnabled = true;
this.normalizeUri = true;
}
最后可以通过自动注入的方式来使用ElasticsearchClient这个类,旧版的RestHighLevelClient这种方法官方已经弃用了。
private ElasticsearchClient client;
@Autowired
public void setClient(ElasticsearchClient client) {
this.client = client;
}