从 4.3.x 升级到 4.4.x
本节描述了从 4.3.x 版本到 4.4.x 版本的破坏性变更,以及如何用新引入的功能替换已移除的功能。
破坏性变更
移除弃用的类
org.springframework.data.elasticsearch.core.ElasticsearchTemplate
已被移除
从 4.4 版本开始,Spring Data Elasticsearch 不再使用 Elasticsearch 的 TransportClient
(该客户端自 Elasticsearch 7.0 起已弃用)。这意味着自 Spring Data Elasticsearch 4.0 起已弃用的 org.springframework.data.elasticsearch.core.ElasticsearchTemplate
类已被移除。它是使用 TransportClient
的 ElasticsearchOperations
接口的实现。连接到 Elasticsearch 必须使用命令式 ElasticsearchRestTemplate
或响应式 ReactiveElasticsearchTemplate
。
包变更
在 4.3 版本中,为集成新的 Elasticsearch 客户端,有两个类(ElasticsearchAggregations
和 ElasticsearchAggregation
)曾被移至 org.springframework.data.elasticsearch.core.clients.elasticsearch7
包。现已将它们移回 org.springframework.data.elasticsearch.core
包,因为我们保留了使用旧 Elasticsearch 客户端的类在原来的位置。
行为变更
ReactiveElasticsearchTemplate
在直接创建或通过 Spring Boot 配置创建时,默认刷新策略为 IMMEDIATE。这在大量索引时可能导致性能问题,并且与 Elasticsearch 的默认行为不同。现已更改为默认刷新策略为 NONE。当通过 响应式 REST 客户端 中描述的配置提供 ReactiveElasticsearchTemplate
时,默认刷新策略已设置为 NONE。
新的 Elasticsearch 客户端
Elasticsearch 引入了新的 ElasticsearchClient
并弃用了之前的 RestHighLevelClient
。出于以下原因,Spring Data Elasticsearch 4.4 仍将旧客户端用作默认客户端:
-
新客户端强制应用程序使用
jakarta.json.spi.JsonProvider
包,而 Spring Boot 在版本 3 之前将一直使用javax.json.spi.JsonProvider
。因此,Spring Data Elasticsearch 中的默认实现切换只能在 Spring Data Elasticsearch 5(Spring Data 3,Spring 6)中进行。 -
Elasticsearch 客户端中仍有一些需要解决的 bug
-
由于投入资源有限,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
的配置 bean
@Configuration
public class NewRestClientConfig extends ElasticsearchConfiguration {
@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder() //
.connectedTo("localhost:9200") //
.build();
}
}
配置方式与旧客户端相同,但不再需要创建除了配置 bean 之外的更多 bean。通过此配置,Spring 应用上下文中将提供以下 bean:
-
一个
RestClient
bean,它是配置的由 Elasticsearch 客户端使用的底层RestClient
-
一个
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();
}
}
通过此配置,Spring 应用上下文中将提供以下 bean:
-
一个
RestClient
bean,它是配置的由 Elasticsearch 客户端使用的底层RestClient
-
一个
ReactiveElasticsearchClient
bean,这是使用RestClient
的新响应式客户端 -
一个
ReactiveElasticsearchOperations
bean,可用 bean 名称为 reactiveElasticsearchOperations 和 reactiveElasticsearchTemplate,它使用ReactiveElasticsearchClient