从 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 包中。

行为变更

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 客户端中仍然存在一些需要解决的错误。

  • 在 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 派生的配置 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

响应式风格

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

@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