从 4.4.x 升级到 5.0.x

本节描述了从 4.4.x 版本到 5.0.x 版本的破坏性变更,以及如何用新引入的特性替代已移除的特性。

弃用

自定义跟踪级别日志

通过设置属性 logging.level.org.springframework.data.elasticsearch.client.WIRE=trace 进行日志记录现在已弃用,Elasticsearch RestClient 提供了更好的解决方案,可以通过将 tracer 包的日志级别设置为 "trace" 来激活。

org.springframework.data.elasticsearch.client.erhlc

请参阅 包变更,此包中的所有类都已被弃用,因为默认使用的客户端实现是基于 Elasticsearch 新的 Java 客户端的,请参阅 新的 Elasticsearch 客户端

移除已弃用的代码

DateFormat.noneDateFormat.custom 自 4.2 版本以来已被弃用,现已移除。

@Document 中自 4.2 版本以来已被弃用的属性现已移除。请使用 @Settings 注解替代。

@DynamicMapping@DynamicMappingValue 已移除。请改用 @Document.dynamic@Field.dynamic

破坏性变更

移除已弃用的调用

操作接口中的 suggest 调用已移除

SearchOperationsReactiveSearchOperations 都有使用 Elasticsearch 类作为参数的已弃用调用。这些调用现已移除,因此这些 API 对 Elasticsearch 类的依赖已被清除。

包变更

所有使用或依赖于已弃用的 Elasticsearch RestHighLevelClient 的类都已移至 org.springframework.data.elasticsearch.client.erhlc 包。通过这一变更,我们现在清晰地分离了使用旧的已弃用 Elasticsearch 库的代码、使用新的 Elasticsearch 客户端的代码以及不依赖于特定客户端实现的代码。此外,此前提供的响应式实现也已移至此处,因为该实现包含从 Elasticsearch 库复制和修改的代码。

如果您直接使用 ElasticsearchRestTemplate 而非 ElasticsearchOperations 接口,则还需要调整您的导入。

使用 NativeSearchQuery 类时,您需要切换到 NativeQuery 类,该类可以接受来自新的 Elasticsearch 客户端库的 Query 实例。您可以在测试代码中找到大量示例。

转换为 Java 17 Record

以下类已转换为 Record,您可能需要将 getter 方法的使用从 getProp() 调整为 prop()

  • org.springframework.data.elasticsearch.core.AbstractReactiveElasticsearchTemplate.IndexResponseMetaData

  • org.springframework.data.elasticsearch.core.ActiveShardCount

  • org.springframework.data.elasticsearch.support.Version

  • org.springframework.data.elasticsearch.support.ScoreDoc

  • org.springframework.data.elasticsearch.core.query.ScriptData

  • org.springframework.data.elasticsearch.core.query.SeqNoPrimaryTerm

新的 HttpHeaders 类

直到 4.4 版本,客户端配置使用的是来自 org.springframework:spring-web 项目的 HttpHeaders 类。这引入了对该工件的依赖。不使用 spring-web 的用户会因此遇到找不到此类的错误。

在 5.0 版本中,我们引入了自己的 HttpHeaders 来配置客户端。

因此,如果您在客户端配置中使用了头部,需要将 org.springframework.http.HttpHeaders 替换为 org.springframework.data.elasticsearch.support.HttpHeaders

提示:您可以将 org.springframework.http.HttpHeaders 传递给 org.springframework.data.elasticsearch.support.HttpHeadersaddAll() 方法。

新的 Elasticsearch 客户端

Spring Data Elasticsearch 现在使用新的 ElasticsearchClient 并已弃用之前的 RestHighLevelClient

命令式风格配置

要配置 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

仍想使用旧客户端?

旧的已弃用 RestHighLevelClient 仍可使用,但您需要将依赖项显式添加到您的应用程序中,因为 Spring Data Elasticsearch 不再自动引入它。

<!-- include the RHLC, specify version explicitly	-->
<dependency>
	<groupId>org.elasticsearch.client</groupId>
	<artifactId>elasticsearch-rest-high-level-client</artifactId>
	<version>7.17.5</version>
	<exclusions>
		<exclusion>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
		</exclusion>
	</exclusions>
</dependency>

请务必显式指定版本 7.17.6,否则 Maven 将解析到 8.5.0,而该版本不存在。