从 4.3.x 升级到 4.4.x

本节描述了从 4.3.x 版本到 4.4.x 版本的破坏性变更,以及如何使用新引入的功能替代已被移除的功能。spring-doc.cadn.net.cn

弃用

org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperations

方法 <T> Publisher<T> execute(ClientCallback<Publisher<T>> callback) 已被弃用。 由于现在存在使用不同客户端库的多种实现,execute 方法在各个具体实现中仍然可用,但接口中不再包含该方法,因为不同的客户端之间没有统一的回调接口。spring-doc.cadn.net.cn

重大变更

移除已弃用的类

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 类已被移除。 这是使用 TransportClientElasticsearchOperations 接口的实现。 连接到 Elasticsearch 必须使用命令式的 ElasticsearchRestTemplate 或响应式的 ReactiveElasticsearchTemplatespring-doc.cadn.net.cn

包变更

在 4.3 版本中,两个类(ElasticsearchAggregationsElasticsearchAggregation)已被移至 org.springframework.data.elasticsearch.core.clients.elasticsearch7 包,以为集成新的 Elasticsearch 客户端做准备。 由于我们保留这些类继续使用旧的 Elasticsearch 客户端,因此它们又被移回原来的 org.springframework.data.elasticsearch.core 包。spring-doc.cadn.net.cn

行为变更

ReactiveElasticsearchTemplate 在直接创建或通过 Spring Boot 配置创建时,默认的刷新策略为 IMMEDIATE(立即)。 这可能在大量索引操作时引发性能问题,且与 Elasticsearch 的默认行为不一致。 现已更改为:默认刷新策略为 NONE(无)。 当通过如 Reactive REST Client 中所述的配置方式提供 ReactiveElasticsearchTemplate 时,默认刷新策略已设置为 NONE(无)。spring-doc.cadn.net.cn

新的 Elasticsearch 客户端

Elasticsearch 已推出其新的 ElasticsearchClient,并弃用了之前的 RestHighLevelClient。 Spring Data Elasticsearch 4.4 仍使用旧客户端作为默认客户端,原因如下:spring-doc.cadn.net.cn

  • 新客户端强制应用程序使用 jakarta.json.spi.JsonProvider 包,而 Spring Boot 在版本 3 之前将坚持使用 javax.json.spi.JsonProvider。因此,在 Spring Data Elasticsearch 中切换默认实现只能随 Spring Data Elasticsearch 5(Spring Data 3、Spring 6)一起提供。spring-doc.cadn.net.cn

  • Elasticsearch 客户端中仍有一些需要解决的缺陷spring-doc.cadn.net.cn

  • 由于相关资源有限,使用 Spring Data Elasticsearch 中新客户端的实现尚未完成——请记住,Spring Data Elasticsearch 是一个由社区驱动的项目,依靠公众的贡献而发展。spring-doc.cadn.net.cn

如何使用新客户端

使用新客户端的实现尚未完成,某些操作将抛出异常。java.lang.UnsupportedOperationException或者可能会抛出空指针异常(例如,当 Elasticsearch 无法解析来自服务器的响应时,这种情况有时仍会发生)
请使用新客户端测试实现,但切勿在生产代码中使用!

为了尝试并使用新客户端,需要执行以下步骤:spring-doc.cadn.net.cn

确保不要配置现有的默认客户端

如果使用 Spring Boot,请从自动配置中排除 Spring Data Elasticsearchspring-doc.cadn.net.cn

@SpringBootApplication(exclude = ElasticsearchDataAutoConfiguration.class)
public class SpringdataElasticTestApplication {
	// ...
}

从您的应用程序配置中移除与 Spring Data Elasticsearch 相关的属性。 如果 Spring Data Elasticsearch 是通过编程方式配置的(请参阅 Elasticsearch 客户端),请将这些 Bean 从 Spring 应用上下文中移除。spring-doc.cadn.net.cn

添加依赖项

新 Elasticsearch 客户端的依赖项在 Spring Data Elasticsearch 中仍然是可选的,因此需要显式添加:spring-doc.cadn.net.cn

<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 中设置以下属性。spring-doc.cadn.net.cn

<properties>
    <jakarta-json.version>2.0.1</jakarta-json.version>
</properties>

新的配置类

命令式风格

为了配置 Spring Data Elasticsearch 以使用新客户端,需要创建一个派生自 org.springframework.data.elasticsearch.client.elc.ElasticsearchConfiguration 的配置 Bean:spring-doc.cadn.net.cn

@Configuration
public class NewRestClientConfig extends ElasticsearchConfiguration {

	@Override
	public ClientConfiguration clientConfiguration() {
		return ClientConfiguration.builder() //
			.connectedTo("localhost:9200") //
			.build();
	}
}

配置方式与旧客户端相同,但不再需要创建除配置 Bean 之外的其他内容。 通过此配置,以下 Bean 将在 Spring 应用上下文中可用:spring-doc.cadn.net.cn

  • a RestClient bean,即由 Elasticsearch 客户端使用的已配置的低级RestClientspring-doc.cadn.net.cn

  • 一个 ElasticsearchClient Bean,这是使用 RestClient 的新客户端spring-doc.cadn.net.cn

  • 一个 ElasticsearchOperations Bean,可通过名称 elasticsearchOperationselasticsearchTemplate 获取,它使用了 ElasticsearchClientspring-doc.cadn.net.cn

响应式风格

要在响应式环境中使用新客户端,唯一的区别在于用于派生配置的类:spring-doc.cadn.net.cn

@Configuration
public class NewRestClientConfig extends ReactiveElasticsearchConfiguration {

	@Override
	public ClientConfiguration clientConfiguration() {
		return ClientConfiguration.builder() //
			.connectedTo("localhost:9200") //
			.build();
	}
}

使用此配置,以下 Bean 将在 Spring 应用上下文中可用:spring-doc.cadn.net.cn

  • a RestClient bean,即由 Elasticsearch 客户端使用的已配置的低级RestClientspring-doc.cadn.net.cn

  • 一个 ReactiveElasticsearchClient Bean,这是使用 RestClient 的新响应式客户端。spring-doc.cadn.net.cn

  • 一个 ReactiveElasticsearchOperations Bean,可通过 Bean 名称 reactiveElasticsearchOperationsreactiveElasticsearchTemplate 获取,它使用了 ReactiveElasticsearchClientspring-doc.cadn.net.cn