本节介绍从版本 4.3.x 到 4.4.x 的重大更改,以及如何将已删除的功能替换为新引入的功能。
重大变更
删除已弃用的类
org.springframework.data.elasticsearch.core.ElasticsearchTemplate已被删除
从 4.4 版开始,Spring Data Elasticsearch 不再使用 Elasticsearch(自 Elasticsearch 7.0 起已弃用)。
这意味着自 Spring Data Elasticsearch 4.0 以来已弃用的类已被删除。
这是使用 .
必须使用命令式或反应式 .TransportClientorg.springframework.data.elasticsearch.core.ElasticsearchTemplateElasticsearchOperationsTransportClientElasticsearchRestTemplateReactiveElasticsearchTemplate
软件包更改
在 4.3 中,两个类( 和 )被移到了软件包中,为集成新的 Elasticsearch 客户端做准备。
这些被移回了包中,因为我们保留了这些类使用它们所在的旧 Elasticsearch 客户端。ElasticsearchAggregationsElasticsearchAggregationorg.springframework.data.elasticsearch.core.clients.elasticsearch7org.springframework.data.elasticsearch.core
行为改变
直接创建或由 Spring Boot 配置创建时,默认刷新策略为 IMMEDIATE。
这可能会导致繁重索引的性能问题,并且与 Elasticsearch 的默认行为不同。
这已更改为现在默认刷新策略为 NONE。
当使用反应式 REST 客户端中所述的配置提供时,默认刷新策略已设置为 NONE。ReactiveElasticsearchTemplateReactiveElasticsearchTemplate
新 Elasticsearch 客户端
Elasticsearch 引入了它的新功能,并弃用了以前的 .
Spring Data Elasticsearch 4.4 仍然使用旧客户端作为默认客户端,原因如下:ElasticsearchClientRestHighLevelClient
- 
新客户端强制应用程序使用该包,而 Spring Boot 将坚持到版本 3。因此,在Spring Data Elasticsearch中切换默认实现只能与Spring Data Elasticsearch 5(Spring Data 3,Spring 6)一起提供。
jakarta.json.spi.JsonProviderjavax.json.spi.JsonProvider - 
Elasticsearch 客户端中仍有一些 bug 需要解决
 - 
由于资源有限,在 Spring Data Elasticsearch 中使用新客户端的实现尚未完成 - 请记住,Spring Data Elasticsearch 是一个社区驱动的项目,它以公共贡献为生。
 
如何使用新客户端
| 使用新客户端的实现尚未完成,某些操作会抛出或可能抛出 NPE(例如,当 Elasticsearch 无法解析来自服务器的响应时,有时仍然会发生这种情况) 使用新客户端测试实现,但不要在生产代码中使用它! java.lang.UnsupportedOperationException | 
为了尝试使用新客户端,必须执行以下步骤:
请确保不配置现有的默认客户端
如果使用 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以使用新客户端,必须创建一个配置Bean,该bean派生自: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 应用程序上下文中可用:
- 
一个 bean,即 Elasticsearch 客户端使用的配置低级别
RestClientRestClient - 
一个 bean,这是使用
ElasticsearchClientRestClient - 
一个 bean,提供 bean 名称 elasticsearchOperations 和 elasticsearchTemplate,它使用
ElasticsearchOperationsElasticsearchClient 
反应式
要在响应式环境中使用新客户端,唯一的区别是要从中派生配置的类:
@Configuration
public class NewRestClientConfig extends ReactiveElasticsearchConfiguration {
	@Override
	public ClientConfiguration clientConfiguration() {
		return ClientConfiguration.builder() //
			.connectedTo("localhost:9200") //
			.build();
	}
}
使用此配置,以下 Bean 将在 Spring 应用程序上下文中可用:
- 
一个 bean,即 Elasticsearch 客户端使用的配置低级别
RestClientRestClient - 
一个 bean,这是使用
ReactiveElasticsearchClientRestClient - 
一个 bean,提供 bean 名称 reactiveElasticsearchOperations 和 reactiveElasticsearchTemplate,它使用
ReactiveElasticsearchOperationsReactiveElasticsearchClient 
| 使用新客户端的实现尚未完成,某些操作会抛出或可能抛出 NPE(例如,当 Elasticsearch 无法解析来自服务器的响应时,有时仍然会发生这种情况) 使用新客户端测试实现,但不要在生产代码中使用它! java.lang.UnsupportedOperationException |