从 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 类已被移除。这是使用 TransportClientElasticsearchOperations 接口的实现。与 Elasticsearch 的连接必须使用命令式 ElasticsearchRestTemplate 或响应式 ReactiveElasticsearchTemplate

包变更

在 4.3 版本中,为了集成新的 Elasticsearch 客户端,两个类(ElasticsearchAggregationsElasticsearchAggregation)被移到了 org.springframework.data.elasticsearch.core.clients.elasticsearch7 包中。现在它们又被移回了 org.springframework.data.elasticsearch.core 包,因为我们保留了使用旧 Elasticsearch 客户端的类。

行为变更

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

新的 Elasticsearch 客户端

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

  • 新客户端强制应用程序使用 jakarta.json.spi.JsonProvider 包,而 Spring Boot 将在版本 3 之前坚持使用 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 客户端)配置的,则从 Spring 应用程序上下文中移除这些 bean。

添加依赖

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>

新配置类

命令式风格

为了配置 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

© . This site is unofficial and not affiliated with VMware.