此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Data Elasticsearch 5.4.0spring-doc.cn

Elasticsearch 客户端

本章说明了受支持的 Elasticsearch 客户端实现的配置和使用。spring-doc.cn

Spring Data Elasticsearch 在连接到单个 Elasticsearch 节点或集群的 Elasticsearch 客户端(由 Elasticsearch 客户端库提供)上运行。 尽管 Elasticsearch 客户端可以直接用于处理集群,但使用 Spring Data Elasticsearch 的应用程序通常使用 Elasticsearch OperationsElasticsearch Repositories 的更高级别抽象。spring-doc.cn

命令式 REST 客户端

要使用命令式(非反应式)客户端,必须像这样配置配置 Bean:spring-doc.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 有关 Builder 方法的详细说明,请参阅客户端配置

ElasticsearchConfiguration] 类允许通过覆盖 or 方法进行进一步配置。jsonpMapper()transportOptions()spring-doc.cn

然后,可以将以下 bean 注入其他 Spring 组件中:spring-doc.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 库中的 low 级别RestClient
4 Elasticsearch 的用户JsonpMapperTransport

基本上,您应该只使用 ElasticsearchOperations 与 Elasticsearch 集群进行交互。 使用存储库时,此实例也在后台使用。spring-doc.cn

反应式 REST 客户端

当使用反应式堆栈时,配置必须从不同的类派生:spring-doc.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 有关 Builder 方法的详细说明,请参阅客户端配置

ReactiveElasticsearchConfiguration 类允许通过覆盖 or 方法进行进一步配置。jsonpMapper()transportOptions()spring-doc.cn

然后,可以将以下 bean 注入其他 Spring 组件中:spring-doc.cn

@Autowired
ReactiveElasticsearchOperations operations;      (1)

@Autowired
ReactiveElasticsearchClient elasticsearchClient; (2)

@Autowired
RestClient restClient;                           (3)

@Autowired
JsonpMapper jsonpMapper;                         (4)

可以注射以下药物:spring-doc.cn

1 ReactiveElasticsearchOperations 的实现
2 那个是用的。 这是基于 Elasticsearch 客户端实现的反应式实现。org.springframework.data.elasticsearch.client.elc.ReactiveElasticsearchClient
3 Elasticsearch 库中的 low 级别RestClient
4 Elasticsearch 的用户JsonpMapperTransport

基本上,应该只使用 ReactiveElasticsearchOperations 与 Elasticsearch 集群进行交互。 使用存储库时,此实例也在后台使用。spring-doc.cn

客户端配置

客户端行为可以通过 ClientConfiguration 来更改,ClientConfiguration 允许设置 SSL、connect 和 socket 超时、标头和其他参数的选项。spring-doc.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 使用构建器提供集群地址、设置 default 或 enable SSL。HttpHeaders
3 (可选)启用 SSL。此函数存在重载,该重载可以采用证书的指纹或作为替代,因为它是 Elasticsearch 8 在启动时输出的。SSLContext
4 (可选)设置代理。
5 (可选)设置路径前缀,主要在不同的集群后面使用某个反向代理。
6 设置连接超时。
7 设置套接字超时。
8 (可选)设置 headers。
9 添加基本身份验证。
10 可以指定一个函数,每次在将请求发送到 Elasticsearch 之前都会调用该函数 - 例如,当前时间写入标头中。Supplier<HttpHeaders>
11 配置创建的客户端的函数(参见 客户端配置回调),可以多次添加。
如上例所示,添加 Header 供应商允许注入可能随时间变化的 Headers,例如身份验证 JWT 令牌。 如果在响应式设置中使用了这个功能,则 supplier 函数不能阻塞!

客户端配置回调

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

提供如下回调:spring-doc.cn

低级 Elasticsearch 的配置:RestClient

此回调提供了一个可用于配置 Elasticsearch 的回调:org.elasticsearch.client.RestClientBuilderRestClientspring-doc.cn

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

低级 Elasticsearch 使用的 HttpAsyncClient 的配置:RestClient

此回调提供了一个用于配置 HttpCLient 的 由 .org.apache.http.impl.nio.client.HttpAsyncClientBuilderRestClientspring-doc.cn

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

客户端日志记录

要查看实际发送到服务器和从服务器接收的内容/需要打开传输级别的日志记录,如下面的代码段中所述。 这可以通过在 Elasticsearch 客户端中通过将包的级别设置为 “trace” 来启用(参见 www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/java-rest-low-usage-logging.htmlRequestResponsetracer)spring-doc.cn

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