跳到主要内容
版本:6.1.1

Elasticsearch 客户端

Doubao 中英对照 Elasticsearch Clients

本章介绍受支持的 Elasticsearch 客户端实现的配置与用法。

Spring Data Elasticsearch 基于一个 Elasticsearch 客户端(由 Elasticsearch 客户端库提供)运行,该客户端连接到单个 Elasticsearch 节点或集群。虽然 Elasticsearch 客户端可以直接用于操作集群,但使用 Spring Data Elasticsearch 的应用程序通常使用 ElasticsearchOperations 与 Elasticsearch 仓库 这些更高层次的抽象。

命令式 Rest5Client​

要使用命令式(非响应式)Rest5Client——自第 9 版起 Elasticsearch Java 客户端库提供的默认客户端——必须像这样配置一个配置 Bean:

import org.springframework.data.elasticsearch.client.elc.ElasticsearchConfiguration;

@Configuration
public class MyClientConfig extends ElasticsearchConfiguration {

@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder() 1
.connectedTo("localhost:9200")
.build();
}
}

ElasticsearchConfiguration 类允许通过重写 jsonpMapper() 或 transportOptions() 等方法进行进一步配置。

然后可以将以下 Bean 注入到其他 Spring 组件中:

import org.springframework.beans.factory.annotation.Autowired;

@Autowired
ElasticsearchOperations operations; 1

@Autowired
ElasticsearchClient elasticsearchClient; 2

@Autowired
Rest5Client rest5Client; 3

@Autowired
JsonpMapper jsonpMapper; 4
  • ElasticsearchOperations 的一个实现

  • 所使用的 co.elastic.clients.elasticsearch.ElasticsearchClient。

  • 来自 Elasticsearch 库的低级 Rest5Client

  • 供 Elasticsearch Transport 使用的 JsonpMapper

基本上,您应该只使用 ElasticsearchOperations 与 Elasticsearch 集群交互。在使用仓库时,底层也会使用这个实例。

已弃用的命令式 RestClient​

要使用命令式(非响应式)RestClient——自第 6 版起已弃用——需要添加以下依赖,并适配正确的版本。在 Spring Boot 应用程序中需要进行排除:

<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>${elasticsearch-client.version}</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>

然后必须像这样配置配置 Bean:

import org.springframework.data.elasticsearch.client.elc.ElasticsearchLegacyRestClientConfiguration;

@Configuration
public class MyClientConfig extends ElasticsearchLegacyRestClientConfiguration {

@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder() 1
.connectedTo("localhost:9200")
.build();
}
}

ElasticsearchConfiguration 类允许通过重写 jsonpMapper() 或 transportOptions() 等方法进行进一步配置。

然后可以将以下 Bean 注入到其他 Spring 组件中:

import org.springframework.beans.factory.annotation.Autowired;

@Autowired
ElasticsearchOperations operations; 1

@Autowired
ElasticsearchClient elasticsearchClient; 2

@Autowired
RestClient restClient; 3

@Autowired
JsonpMapper jsonpMapper; 4
  • ElasticsearchOperations 的一个实现

  • 所使用的 co.elastic.clients.elasticsearch.ElasticsearchClient。

  • 来自 Elasticsearch 库的低级 RestClient

  • 供 Elasticsearch Transport 使用的 JsonpMapper

基本上,您应该只使用 ElasticsearchOperations 与 Elasticsearch 集群交互。在使用仓库时,底层也会使用这个实例。

响应式 Rest5Client​

在使用响应式技术栈时,配置必须派生自另一个类:

import org.springframework.data.elasticsearch.client.elc.ReactiveElasticsearchConfiguration;

@Configuration
public class MyClientConfig extends ReactiveElasticsearchConfiguration {

@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder() 1
.connectedTo("localhost:9200")
.build();
}
}

ReactiveElasticsearchConfiguration 类允许通过重写 jsonpMapper() 或 transportOptions() 等方法进行进一步配置。

然后可以将以下 Bean 注入到其他 Spring 组件中:

import org.springframework.beans.factory.annotation.Autowired;

@Autowired
ReactiveElasticsearchOperations operations; 1

@Autowired
ReactiveElasticsearchClient elasticsearchClient; 2

@Autowired
Rest5Client rest5Client; 3

@Autowired
JsonpMapper jsonpMapper; 4

可以注入以下内容:

  • ReactiveElasticsearchOperations 的一个实现

  • 所使用的 org.springframework.data.elasticsearch.client.elc.ReactiveElasticsearchClient。这是一个基于 Elasticsearch 客户端实现的响应式实现。

  • 来自 Elasticsearch 库的低级 RestClient

  • 供 Elasticsearch Transport 使用的 JsonpMapper

基本上,您应该只使用 ReactiveElasticsearchOperations 与 Elasticsearch 集群交互。在使用仓库时,底层也会使用这个实例。

已弃用的响应式 RestClient​

有关使用已弃用 RestClient 所需包含的依赖,请参阅上面命令式客户端一节。

在使用响应式技术栈时,配置必须派生自另一个类:

import org.springframework.data.elasticsearch.client.elc.ReactiveElasticsearchLegacyRestClientConfiguration;

@Configuration
public class MyClientConfig extends ReactiveElasticsearchLegacyRestClientConfiguration {

@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder() 1
.connectedTo("localhost:9200")
.build();
}
}

ReactiveElasticsearchConfiguration 类允许通过重写 jsonpMapper() 或 transportOptions() 等方法进行进一步配置。

然后可以将以下 Bean 注入到其他 Spring 组件中:

import org.springframework.beans.factory.annotation.Autowired;

@Autowired
ReactiveElasticsearchOperations operations; 1

@Autowired
ReactiveElasticsearchClient elasticsearchClient; 2

@Autowired
RestClient restClient; 3

@Autowired
JsonpMapper jsonpMapper; 4

可以注入以下内容:

  • ReactiveElasticsearchOperations 的一个实现

  • 所使用的 org.springframework.data.elasticsearch.client.elc.ReactiveElasticsearchClient。这是一个基于 Elasticsearch 客户端实现的响应式实现。

  • 来自 Elasticsearch 库的低级 RestClient

  • 供 Elasticsearch Transport 使用的 JsonpMapper

基本上,您应该只使用 ReactiveElasticsearchOperations 与 Elasticsearch 集群交互。在使用仓库时,底层也会使用这个实例。

客户端配置​

客户端行为可以通过 ClientConfiguration 更改,该配置允许设置 SSL、连接与套接字超时、请求头及其他参数。

示例 1. 客户端配置

import org.springframework.data.elasticsearch.client.ClientConfiguration;
import org.springframework.data.elasticsearch.support.HttpHeaders;

import static org.springframework.data.elasticsearch.client.elc.ElasticsearchClients.*;

HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("some-header", "on every request") 1

ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo("localhost:9200", "localhost:9291") 2
.usingSsl() 3
.withProxy("localhost:8888") 4
.withPathPrefix("ela") 5
.withConnectTimeout(Duration.ofSeconds(5)) 6
.withSocketTimeout(Duration.ofSeconds(3)) 7
.withDefaultHeaders(defaultHeaders) 8
.withBasicAuth(username, password) 9
.withHeaders(() -> { 10
HttpHeaders headers = new HttpHeaders();
headers.add("currentTime", LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
return headers;
})
.withClientConfigurer( 11
ElasticsearchHttpClientConfigurationCallback.from(clientBuilder -> {
// ...
return clientBuilder;
}))
. // ... other options
.build();
  • 定义默认请求头(如果需要自定义)

  • 使用构建器提供集群地址、设置默认 HttpHeaders 或启用 SSL。

  • 可选地启用 SSL。该方法存在一些重载形式,可以接收 SSLContext,或者作为替代,接收 Elasticsearch 启动时输出的证书指纹(自第 8 版起)。

  • 可选地设置代理。

  • 可选地设置路径前缀,多用于不同集群位于某个反向代理之后的情况。

  • 设置连接超时。

  • 设置套接字超时。

  • 可选地设置请求头。

  • 添加基本认证。

  • 可以指定一个 Supplier<HttpHeaders> 函数,它会在每次向 Elasticsearch 发送请求之前被调用——这里作为示例,将当前时间写入一个请求头。

  • 一个用于配置所创建客户端的函数(请参阅客户端配置回调),可以添加多次。

important

如上例所示添加请求头供应器,可以注入可能随时间变化的请求头,例如认证 JWT 令牌。如果在响应式配置中使用它,该供应器函数绝不能阻塞!

客户端配置回调​

ClientConfiguration 类提供了配置客户端最常用的参数。如果这些不够用,用户可以使用 withClientConfigurer(ClientConfigurationCallback<?>) 方法添加回调函数。

提供了以下回调:

低级 Elasticsearch Rest5Client 的配置:​

这个回调提供一个 org.elasticsearch.client.RestClientBuilder,可用于配置 Elasticsearch Rest5Client:

ClientConfiguration.builder()
.connectedTo("localhost:9200", "localhost:9291")
.withClientConfigurer(Rest5Clients.ElasticsearchRest5ClientConfigurationCallback.from(restClientBuilder -> {
// configure the Elasticsearch Rest5Client
return restClientBuilder;
}))
.build();

已弃用的低级 Elasticsearch RestClient 的配置:​

这个回调提供一个 org.elasticsearch.client.RestClientBuilder,可用于配置 Elasticsearch RestClient:

ClientConfiguration.builder()
.connectedTo("localhost:9200", "localhost:9291")
.withClientConfigurer(RestClients.ElasticsearchRestClientConfigurationCallback.from(restClientBuilder -> {
// configure the Elasticsearch RestClient
return restClientBuilder;
}))
.build();

低级 Elasticsearch Rest5Client 所使用的 HttpAsyncClient 的配置:​

这个回调提供一个 org.apache.hc.client5.http.impl.async.HttpAsyncClientBuilder,用于配置 Rest5Client 所使用的 HttpClient。

ClientConfiguration.builder()
.connectedTo("localhost:9200", "localhost:9291")
.withClientConfigurer(Rest5Clients.ElasticsearchHttpClientConfigurationCallback.from(httpAsyncClientBuilder -> {
// configure the HttpAsyncClient
return httpAsyncClientBuilder;
}))
.build();

已弃用的低级 Elasticsearch RestClient 所使用的 HttpAsyncClient 的配置:​

这个回调提供一个 org.apache.http.impl.nio.client.HttpAsyncClientBuilder,用于配置 RestClient 所使用的 HttpClient。

ClientConfiguration.builder()
.connectedTo("localhost:9200", "localhost:9291")
.withClientConfigurer(RestClients.ElasticsearchHttpClientConfigurationCallback.from(httpAsyncClientBuilder -> {
// configure the HttpAsyncClient
return httpAsyncClientBuilder;
}))
.build();

低级 Elasticsearch Rest5Client 所使用的 ConnectionConfig 的配置:​

这个回调提供一个 org.apache.hc.client5.http.config.ConnectionConfig,用于配置 Rest5Client 所使用的连接。

ClientConfiguration.builder()
.connectedTo("localhost:9200", "localhost:9291")
.withClientConfigurer(Rest5Clients.ElasticsearchConnectionConfigurationCallback.from(connectionConfigBuilder -> {
// configure the connection
return connectionConfigBuilder;
}))
.build();

低级 Elasticsearch Rest5Client 所使用的 ConnectionManager 的配置:​

这个回调提供一个 org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder,用于配置 Rest5Client 所使用的连接管理器。

ClientConfiguration.builder()
.connectedTo("localhost:9200", "localhost:9291")
.withClientConfigurer(Rest5Clients.ElasticsearchConnectionManagerCallback.from(connectionManagerBuilder -> {
// configure the connection manager
return connectionManagerBuilder;
}))
.build();

低级 Elasticsearch Rest5Client 所使用的 RequestConfig 的配置:​

这个回调提供一个 org.apache.hc.client5.http.config.RequestConfig,用于配置 Rest5Client 所使用的 RequestConfig。

ClientConfiguration.builder()
.connectedTo("localhost:9200", "localhost:9291")
.withClientConfigurer(Rest5Clients.ElasticsearchRequestConfigCallback.from(requestConfigBuilder -> {
// configure the request config
return requestConfigBuilder;
}))
.build();

客户端日志​

要查看实际发送到服务器以及从服务器接收的内容,需要按以下代码片段所述开启传输层的 Request/Response 日志记录。可以在 Elasticsearch 客户端中通过将 co.elastic.clients.transport.rest5_client.low_level.Request 包的日志级别设置为 "trace" 来启用(请参阅 www.elastic.co/docs/reference/elasticsearch/clients/java/transport/rest5-client/usage/logging)

<logger name="co.elastic.clients.transport.rest5_client.low_level.Request" level="trace"/>