此版本仍在开发中,尚未视为稳定版。如需最新稳定版本,请使用 Spring Data Elasticsearch 6.0.4spring-doc.cadn.net.cn

Elasticsearch 客户端

本章阐述了受支持的 Elasticsearch 客户端实现的配置和使用方法。spring-doc.cadn.net.cn

Spring Data Elasticsearch 基于一个 Elasticsearch 客户端(由 Elasticsearch 客户端库提供),该客户端可连接到单个 Elasticsearch 节点或集群。 尽管可以直接使用 Elasticsearch 客户端与集群交互,但使用 Spring Data Elasticsearch 的应用程序通常会采用更高级的抽象:Elasticsearch 操作Elasticsearch 仓库spring-doc.cadn.net.cn

命令式 REST 客户端

要使用命令式(非响应式)客户端,必须按如下方式配置一个配置 Bean:spring-doc.cadn.net.cn

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();
	}
}
1 有关构建器方法的详细描述,请参阅 客户端配置

ElasticsearchConfiguration 类允许通过重写例如 jsonpMapper()transportOptions() 方法进行进一步配置。spring-doc.cadn.net.cn

以下 Bean 随后可注入到其他 Spring 组件中:spring-doc.cadn.net.cn

import org.springframework.beans.factory.annotation.Autowired;@Autowired
ElasticsearchOperations operations;      (1)

@Autowired
ElasticsearchClient elasticsearchClient; (2)

@Autowired
RestClient restClient;                   (3)

@Autowired
JsonpMapper jsonpMapper;                 (4)
1 ElasticsearchOperations 的一种实现
2 使用的 co.elastic.clients.elasticsearch.ElasticsearchClient
3 来自 Elasticsearch 库的底层 RestClient
4 Elasticsearch Transport 的第 JsonpMapper 个用户

基本上,应该只使用 ElasticsearchOperations 来与 Elasticsearch 集群进行交互。 当使用仓库时,该实例也会在底层被使用。spring-doc.cadn.net.cn

响应式 REST 客户端

在使用响应式技术栈时,配置必须源自一个不同的类:spring-doc.cadn.net.cn

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();
	}
}
1 有关构建器方法的详细描述,请参阅 客户端配置

ReactiveElasticsearchConfiguration 类允许通过重写例如 jsonpMapper()transportOptions() 方法进行进一步配置。spring-doc.cadn.net.cn

以下 Bean 随后可注入到其他 Spring 组件中:spring-doc.cadn.net.cn

@Autowired
ReactiveElasticsearchOperations operations;      (1)

@Autowired
ReactiveElasticsearchClient elasticsearchClient; (2)

@Autowired
RestClient restClient;                           (3)

@Autowired
JsonpMapper jsonpMapper;                         (4)

以下内容可以被注入:spring-doc.cadn.net.cn

1 ReactiveElasticsearchOperations 的一种实现
2 使用的 org.springframework.data.elasticsearch.client.elc.ReactiveElasticsearchClient。 这是基于 Elasticsearch 客户端实现的响应式实现。
3 来自 Elasticsearch 库的底层 RestClient
4 Elasticsearch Transport 的第 JsonpMapper 个用户

基本上,应该只使用 ReactiveElasticsearchOperations 来与 Elasticsearch 集群进行交互。 当使用仓库时,该实例也会在底层被使用。spring-doc.cadn.net.cn

客户端配置

客户端行为可以通过 ClientConfiguration 进行更改,该接口允许设置 SSL、连接和套接字超时、请求头以及其他参数。spring-doc.cadn.net.cn

示例 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();
1 定义默认请求头,如果需要自定义的话
2 使用构建器提供集群地址,设置默认值 HttpHeaders 或启用 SSL。
3 可选地启用 SSL。此函数存在重载版本,可以接受 SSLContext,或者接受 Elasticsearch 8 启动时输出的证书指纹作为替代。
4 可选地设置代理。
5 可选地设置路径前缀,主要在多个集群位于某个反向代理后面时使用。
6 设置连接超时时间。
7 设置套接字超时时间。
8 可选地设置请求头。
9 添加基本身份验证。
10 可以指定一个 Supplier<HttpHeaders> 函数,该函数在每次向 Elasticsearch 发送请求之前都会被调用——此处作为示例,将当前时间写入请求头中。
11 一个用于配置已创建客户端的函数(参见 客户端配置回调),可以多次添加。
如上例所示,添加一个 Header 供应器(Header supplier)可以注入可能随时间变化的头部信息,例如身份验证的 JWT Tokens。 如果在响应式设置中使用此功能,供应器函数 绝不能 阻塞!

客户端配置回调

ClientConfiguration 类提供了配置客户端最常用的参数。 如果这些参数不足,用户可以通过使用 withClientConfigurer(ClientConfigurationCallback<?>) 方法添加回调函数。spring-doc.cadn.net.cn

提供以下回调:spring-doc.cadn.net.cn

底层 Elasticsearch 的配置RestClient:

此回调提供一个org.elasticsearch.client.RestClientBuilder,可用于配置 Elasticsearch RestClientspring-doc.cadn.net.cn

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

由底层 Elasticsearch 使用的 HttpAsyncClient 的配置RestClient:

此回调提供一个org.apache.http.impl.nio.client.HttpAsyncClientBuilder,用于配置由RestClient使用的 HttpClient。spring-doc.cadn.net.cn

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

客户端日志记录

要查看实际发送和接收的内容,需要按照以下代码片段所述,在传输级别启用 Request / Response 日志记录。 这可以通过将 tracer 包的日志级别设置为 "trace" 来在 Elasticsearch 客户端中启用(参见 www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/java-rest-low-usage-logging.htmlspring-doc.cadn.net.cn

启用传输层日志记录
<logger name="tracer" level="trace"/>