从 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
通过使用 Reactive REST Client 中描述的配置提供,则默认刷新策略已设置为 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 客户端中仍有一些 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
:
@Configuration
public class NewRestClientConfig extends ElasticsearchConfiguration {
@Override
public ClientConfiguration clientConfiguration() {
return ClientConfiguration.builder() //
.connectedTo("localhost:9200") //
.build();
}
}
配置以与旧 Client 端相同的方式完成,但不再需要创建除配置 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