从 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 版本以来已弃用,现已移除。

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

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

重大更改

移除弃用的调用

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

`SearchOperations` 和 `ReactiveSearchOperations` 都使用了将 Elasticsearch 类作为参数的弃用调用。这些调用现已移除,因此这些 API 中对 Elasticsearch 类的依赖已清除。

包更改

所有使用或依赖于已弃用的 Elasticsearch `RestHighLevelClient` 的类都已移动到 `org.springframework.data.elasticsearch.client.erhlc` 包。通过此更改,我们现在可以清楚地区分使用旧的已弃用 Elasticsearch 库的代码、使用新的 Elasticsearch 客户端的代码以及独立于客户端实现的代码。此外,到目前为止提供的反应式实现也已移动到这里,因为此实现包含从 Elasticsearch 库复制和调整的代码。

如果您直接使用 `ElasticsearchRestTemplate` 而不是 `ElasticsearchOperations` 接口,则也需要调整您的导入。

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

转换为 Java 17 记录

以下类已转换为 `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.HttpHeaders` 的 `addAll()` 方法。

新的 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` 的新客户端

  • 一个名为elasticsearchOperationselasticsearchTemplateElasticsearchOperations 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的新响应式客户端。

  • 一个名为reactiveElasticsearchOperationsreactiveElasticsearchTemplateReactiveElasticsearchOperations bean,它使用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,而该版本不存在。