Upgrading from 4.3.x to 4.4.x

  • 弃用的 org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperations 方法 execute 已被删除。

  • 已弃用的 org.springframework.data.elasticsearch.core.ElasticsearchTemplate 类已删除,因为它依赖于现已弃用的 Elasticsearch TransportClient。

  • ReactiveElasticsearchTemplate 的默认刷新策略已更改为 NONE,以解决繁重索引上的性能问题。

  • 虽然 Elasticsearch 已引入新的 ElasticsearchClient 来取代 RestHighLevelClient,但 Spring Data Elasticsearch 仍继续使用旧客户端作为默认客户端。

  • 提供了使用新客户端的说明,但尚不建议在生产代码中使用。

本部分介绍了从 4.3.x 版到 4.4.x 版的重大变更,以及已删除的功能如何被新引入的功能替换。

Deprecations

org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperations

方法 <T> Publisher<T> execute(ClientCallback<Publisher<T>> callback) 已弃用。由于现在有多个实现使用不同的客户端库,因此 execute 方法仍然在不同的实现中可用,但接口中不再有该方法,因为不同的客户端没有通用的回调接口。

Breaking Changes

Removal of deprecated classes

org.springframework.data.elasticsearch.core.ElasticsearchTemplate has been removed

从 4.4 版开始,Spring Data Elasticsearch 不再使用 Elasticsearch 的 TransportClient(从 Elasticsearch 7.0 版开始它本身已被弃用)。这意味着已从 Spring Data Elasticsearch 4.0 版开始弃用的 org.springframework.data.elasticsearch.core.ElasticsearchTemplate 类也已删除。这是使用 TransportClientElasticsearchOperations 接口的实现。必须使用命令式的 ElasticsearchRestTemplate 或反应式的 ReactiveElasticsearchTemplate 来连接 Elasticsearch。

Package changes

在 4.3 版中,两个类(ElasticsearchAggregationsElasticsearchAggregation)已被移动到 org.springframework.data.elasticsearch.core.clients.elasticsearch7 包中,以便集成新的 Elasticsearch 客户端。我们已将它们移回 org.springframework.data.elasticsearch.core 包中,因为我们继续在这些类中使用旧 Elasticsearch 客户端。

Behaviour change

`ReactiveElasticsearchTemplate`在直接创建或通过 Spring Boot 配置创建时,默认刷新策略为 IMMEDIATE。这可能导致大量索引时性能问题,并且与 Elasticsearch 的默认行为不同。现在已更改为默认刷新策略为 NONE。当通过使用 Reactive REST Client中描述的配置来提供 `ReactiveElasticsearchTemplate`时,默认刷新策略已设置为 NONE。

New Elasticsearch client

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 是一个社区驱动项目,依靠公开贡献而存在。

How to use the new client

使用新客户端的实现尚未完成,一些操作会引发 java.lang.UnsupportedOperationException 或可能引发 NPE(例如,当 Elasticsearch 无法解析来自服务器的响应时,有时仍然会发生这种情况),使用新客户端来测试实现,但不要在生产代码中使用!

为了尝试和使用新客户端,需要以下步骤:

Make sure not to configure the existing default client

如果使用 Spring Boot,从自动配置中排除 Spring Data Elasticsearch

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

从应用程序配置中移除与 Spring Data Elasticsearch 相关的属性。如果 Spring Data Elasticsearch 是使用编程方式配置的 (参见 Elasticsearch Clients),则从 Spring 应用程序上下文中移除这些 Bean。

Add dependencies

Spring Data Elasticsearch 中对新 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>

New configuration classes

Imperative style

为了配置 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 应用程序上下文中可用:

  • RestClient bean,即 Elasticsearch 客户端使用的已配置低级 RestClient

  • ElasticsearchClient bean,这是使用 RestClient 的新客户端

  • ElasticsearchOperations bean,可通过 Bean 名称 elasticsearchOperationselasticsearchTemplate 使用,它使用 ElasticsearchClient

Reactive style

要在反应式环境中使用新客户端,唯一的区别在于用于导出配置的类:

@Configuration
public class NewRestClientConfig extends ReactiveElasticsearchConfiguration {

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

通过此配置,以下 bean 将在 Spring 应用程序上下文中可用:

  • RestClient bean,即 Elasticsearch 客户端使用的已配置低级 RestClient

  • ReactiveElasticsearchClient bean,这是使用 RestClient 的新响应式客户端

  • ReactiveElasticsearchOperations bean,可通过 Bean 名称 reactiveElasticsearchOperationsreactiveElasticsearchTemplate 使用,它使用 ReactiveElasticsearchClient