Elasticsearch 客户端
本章介绍受支持的 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
可以注入以下内容:
所使用的
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
可以注入以下内容:
所使用的
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 发送请求之前被调用——这里作为示例,将当前时间写入一个请求头。一个用于配置所创建客户端的函数(请参阅客户端配置回调),可以添加多次。
如上例所示添加请求头供应器,可以注入可能随时间变化的请求头,例如认证 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)
- XML
- yml
- ini
<logger name="co.elastic.clients.transport.rest5_client.low_level.Request" level="trace"/>
logging.level:
co.elastic.clients.transport.rest5_client.low_level.Request: trace
logging.level.co.elastic.clients.transport.rest5_client.low_level.Request=trace