从 4.3.x 升级到 4.4.x

本节描述了从 4.3.x 版本到 4.4.x 版本的重大更改,以及如何用新引入的功能替换已移除的功能。

弃用

org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperations

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

重大更改

已弃用类的移除

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接口的实现。必须使用命令式ElasticsearchRestTemplate或反应式ReactiveElasticsearchTemplate连接到 Elasticsearch。

包更改

在 4.3 中,两个类(ElasticsearchAggregationsElasticsearchAggregation)已移动到org.springframework.data.elasticsearch.core.clients.elasticsearch7包中,以准备集成新的 Elasticsearch 客户端。由于我们让这些类继续使用旧的 Elasticsearch 客户端,所以它们被移回了org.springframework.data.elasticsearch.core包。

行为更改

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

新的 Elasticsearch 客户端

Elasticsearch 引入了新的ElasticsearchClient并弃用了之前的RestHighLevelClient。Spring Data Elasticsearch 4.4 仍然使用旧客户端作为默认客户端,原因如下:

  • 新客户端强制应用程序使用jakarta.json.spi.JsonProvider包,而 Spring Boot 直到 3.0 版本仍将坚持使用javax.json.spi.JsonProvider。因此,更改 Spring Data Elasticsearch 中的默认实现只能在 Spring Data Elasticsearch 5(Spring Data 3,Spring 6)中实现。

  • Elasticsearch 客户端中仍然存在一些需要解决的错误。

  • 由于用于此工作的资源有限,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 Clients),请从 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 应用上下文可用:

  • 一个RestClient Bean,这是 Elasticsearch 客户端使用的已配置的低级RestClient

  • 一个ElasticsearchClient Bean,这是使用RestClient的新客户端。

  • 一个ElasticsearchOperations Bean,具有elasticsearchOperationselasticsearchTemplate Bean 名称,它使用ElasticsearchClient

响应式风格

在响应式环境中使用新客户端,唯一的区别在于派生配置的类。

@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,具有reactiveElasticsearchOperationsreactiveElasticsearchTemplate Bean 名称,它使用ReactiveElasticsearchClient