此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Data Elasticsearch 5.5.2! |
从 4.3.x 升级到 4.4.x
本节介绍从 4.3.x 版到 4.4.x 版的重大更改,以及如何将删除的功能替换为新引入的功能。
重大变更
删除已弃用的类
org.springframework.data.elasticsearch.core.ElasticsearchTemplate
已被删除
从版本 4.4 开始,Spring Data Elasticsearch 不使用TransportClient
不再来自 Elasticsearch(它本身自 Elasticsearch 7.0 以来已被弃用)。
这意味着org.springframework.data.elasticsearch.core.ElasticsearchTemplate
自 Spring Data Elasticsearch 4.0 以来已弃用的类。
这是ElasticsearchOperations
使用TransportClient
.
必须使用命令式ElasticsearchRestTemplate
或反应性ReactiveElasticsearchTemplate
.
包更改
在 4.3 中,两个类 (ElasticsearchAggregations
和ElasticsearchAggregation
) 已移至org.springframework.data.elasticsearch.core.clients.elasticsearch7
包,为集成新的 Elasticsearch 客户端做准备。
被移回org.springframework.data.elasticsearch.core
package 中,因为我们保留类使用旧的 Elasticsearch 客户端。
行为改变
这ReactiveElasticsearchTemplate
,当直接创建或通过 Spring Boot 配置创建时,默认刷新策略为 IMMEDIATE。
这可能会导致大量索引的性能问题,并且与 Elasticsearch 的默认行为不同。
这已更改为现在默认刷新策略为 NONE。
当ReactiveElasticsearchTemplate
通过使用响应式 REST 客户端中所述的配置提供,默认刷新策略已设置为 NONE。
新的 Elasticsearch 客户端
Elasticsearch 推出了新的ElasticsearchClient
并弃用了以前的RestHighLevelClient
.
Spring Data Elasticsearch 4.4 仍然使用旧客户端作为默认客户端,原因如下:
-
新客户端强制应用程序使用
jakarta.json.spi.JsonProvider
包,而 Spring Boot 将坚持javax.json.spi.JsonProvider
直到版本 3。因此,在 Spring Data Elasticsearch 中切换默认实现只能随 Spring Data Elasticsearch 5(Spring Data 3、Spring 6)一起提供。 -
Elasticsearch 客户端中仍有一些错误需要解决
-
由于资源有限,在 Spring Data Elasticsearch 中使用新客户端的实现尚未完成 - 请记住,Spring Data Elasticsearch 是一个社区驱动的项目,它来自公共贡献。
如何使用新客户端
使用新客户端的实现不完整,某些作会抛出java.lang.UnsupportedOperationException 或者可能会抛出 NPE(例如,当 Elasticsearch 无法解析来自服务器的响应时,有时仍然会发生这种情况)使用新客户端测试实现,但不要在生产代码中使用它! |
为了尝试使用新客户端,需要执行以下步骤:
确保不配置现有的默认客户端
如果使用 Spring Boot,请从自动配置中排除 Spring Data Elasticsearch
@SpringBootApplication(exclude = ElasticsearchDataAutoConfiguration.class)
public class SpringdataElasticTestApplication {
// ...
}
从应用程序配置中删除与 Spring Data Elasticsearch 相关的属性。 如果 Spring Data Elasticsearch 是使用编程配置配置的(请参阅 Elasticsearch 客户端),请从 Spring 应用程序上下文中删除这些 bean。
添加依赖项
新 Elasticsearch 客户端的依赖项在 Spring Data Elasticsearch 中仍然是可选的,因此需要显式添加它们:
<dependencies>
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>7.17.3</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId> <!-- is Apache 2-->
<version>7.17.3</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
使用 Spring Boot 时,需要在pom.xml中设置以下属性。
<properties>
<jakarta-json.version>2.0.1</jakarta-json.version>
</properties>
新的配置类
命令式风格
为了配置 Spring Data Elasticsearch 以使用新客户端,有必要创建一个派生自org.springframework.data.elasticsearch.client.elc.ElasticsearchConfiguration
:
@Configuration
public class NewRestClientConfig extends ElasticsearchConfiguration {
@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder() //
.connectedTo("localhost:9200") //
.build();
}
}
配置的完成方式与旧客户机相同,但不再需要创建配置 Bean 以外的更多内容。 使用此配置,以下 bean 将在 Spring 应用程序上下文中可用:
-
一个
RestClient
bean,即配置的低级别RestClient
由 Elasticsearch 客户端使用的 -
一
ElasticsearchClient
bean,这是使用RestClient
-
一
ElasticsearchOperations
bean,与 bean 名称 elasticsearchOperations 和 elasticsearchTemplate 一起使用,这使用ElasticsearchClient
响应式风格
要在响应式环境中使用新客户端,唯一的区别是从中派生配置的类:
@Configuration
public class NewRestClientConfig extends ReactiveElasticsearchConfiguration {
@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder() //
.connectedTo("localhost:9200") //
.build();
}
}
使用此配置,以下 bean 将在 Spring 应用程序上下文中可用:
-
一个
RestClient
bean,即配置的低级别RestClient
由 Elasticsearch 客户端使用的 -
一
ReactiveElasticsearchClient
bean,这是使用RestClient
-
一
ReactiveElasticsearchOperations
bean,与 bean 名称 reactiveElasticsearchOperations 和 reactiveElasticsearchTemplate 一起使用,这使用ReactiveElasticsearchClient