此版本仍在开发中,尚未视为稳定版。如需最新稳定版本,请使用 Spring Data Elasticsearch 6.0.4spring-doc.cadn.net.cn

从 3.2.x 升级到 4.0.x

本节描述了从版本 3.2.x 到 4.0.x 的破坏性变更,以及如何使用新引入的功能替代已被移除的功能。spring-doc.cadn.net.cn

移除已使用的 Jackson Mapper

4.0.x 版本的一项变更是,Spring Data Elasticsearch 不再使用 Jackson Mapper 将实体映射为 Elasticsearch 所需的 JSON 表示形式(请参阅 Elasticsearch 对象映射)。 在 3.2.x 版本中,Jackson Mapper 是默认使用的映射器。 此前可以通过显式配置切换到基于元模型的转换器(名为 ElasticsearchEntityMapper)(请参阅 元模型对象映射)。spring-doc.cadn.net.cn

在 4.0.x 版本中,基于元模型的转换器是唯一可用的转换器,无需显式配置。 如果您之前曾通过提供如下 Bean 来自定义配置以启用元模型转换器:spring-doc.cadn.net.cn

@Bean
@Override
public EntityMapper entityMapper() {

  ElasticsearchEntityMapper entityMapper = new ElasticsearchEntityMapper(
    elasticsearchMappingContext(), new DefaultConversionService()
  );
  entityMapper.setConversions(elasticsearchCustomConversions());

  return entityMapper;
}

您现在必须移除该 bean,ElasticsearchEntityMapper 接口已被移除。spring-doc.cadn.net.cn

实体配置

部分用户在实体类上使用了自定义的 Jackson 注解,例如为了在 Elasticsearch 中定义映射文档的自定义名称,或配置日期转换。 这些注解不再被支持。 所需功能现在由 Spring Data Elasticsearch 的 @Field 注解提供。 详细信息请参阅 映射注解概述spring-doc.cadn.net.cn

从查询对象中移除隐式索引名称

在 3.2.x 版本中,不同的查询类(例如IndexQuery or SearchQuery具有用于指定操作所涉及的索引名称或索引列表的属性。如果未设置这些属性,则会对传入的实体进行检查,以获取其中配置的索引名称。@Document注解。
在 4.0.x 版本中,索引名称现在必须作为额外的参数提供,其类型为IndexCoordinates通过这种分离,现在可以使用一个查询对象针对不同的索引。spring-doc.cadn.net.cn

因此,例如以下代码:spring-doc.cadn.net.cn

IndexQuery indexQuery = new IndexQueryBuilder()
  .withId(person.getId().toString())
  .withObject(person)
  .build();

String documentId = elasticsearchOperations.index(indexQuery);

必须更改为:spring-doc.cadn.net.cn

IndexCoordinates indexCoordinates = elasticsearchOperations.getIndexCoordinatesFor(person.getClass());

IndexQuery indexQuery = new IndexQueryBuilder()
  .withId(person.getId().toString())
  .withObject(person)
  .build();

String documentId = elasticsearchOperations.index(indexQuery, indexCoordinates);

为了更方便地操作实体并使用实体 @Document 注解中包含的索引名称,已新增如 DocumentOperations.save(T entity) 等方法;spring-doc.cadn.net.cn

新的操作接口

在 3.2 版本中,ElasticsearchOperations 接口定义了 ElasticsearchTemplate 类的所有方法。在 4 版本中,这些函数已被拆分到不同的接口中,使这些接口与 Elasticsearch API 保持一致:spring-doc.cadn.net.cn

ElasticsearchOperations 现在扩展了 DocumentOperationsSearchOperations,并提供了获取 IndexOperations 实例的方法。spring-doc.cadn.net.cn

版本 3.2 中来自 ElasticsearchOperations 接口的所有函数现已移至 IndexOperations 接口,这些函数仍然可用,但已被标记为弃用,并提供了默认实现,将调用委托给新的实现:
/**
 * Create an index for given indexName.
 *
 * @param indexName the name of the index
 * @return {@literal true} if the index was created
 * @deprecated since 4.0, use {@link IndexOperations#create()}
 */
@Deprecated
default boolean createIndex(String indexName) {
	return indexOps(IndexCoordinates.of(indexName)).create();
}

弃用

方法和类

许多函数和类已被弃用。这些函数仍然有效,但 Javadoc 会显示应使用什么来替代它们。spring-doc.cadn.net.cn

来自 ElasticsearchOperations 的示例
/*
 * Retrieves an object from an index.
 *
 * @param query the query defining the id of the object to get
 * @param clazz the type of the object to be returned
 * @return the found object
 * @deprecated since 4.0, use {@link #get(String, Class, IndexCoordinates)}
 */
@Deprecated
@Nullable
<T> T queryForObject(GetQuery query, Class<T> clazz);

Elasticsearch 弃用项

自版本 7 起,Elasticsearch TransportClient 已被弃用,并将在 Elasticsearch 版本 8 中被移除。Spring Data Elasticsearch 在 4.0 版本中弃用了使用 TransportClientElasticsearchTemplate 类。spring-doc.cadn.net.cn

映射类型已在 Elasticsearch 7 中被移除,它们作为已弃用的值仍存在于 Spring Data 的 @Document 注解和 IndexCoordinates 类中,但内部不再使用。spring-doc.cadn.net.cn

移除

  • 正如已经描述的那样,ElasticsearchEntityMapper 接口已被移除。spring-doc.cadn.net.cn

  • SearchQuery 接口已合并到其基接口 Query 中,因此可以直接将其出现替换为 Queryspring-doc.cadn.net.cn

  • 方法 org.springframework.data.elasticsearch.core.ElasticsearchOperations.query(SearchQuery query, ResultsExtractor<T> resultsExtractor);org.springframework.data.elasticsearch.core.ResultsExtractor 接口已被移除。 这些曾用于解析 Elasticsearch 的返回结果,适用于基于 Jackson 的映射器所执行的响应映射不足以满足需求的场景。 自 4.0 版本起,引入了新的 搜索结果类型 来返回 Elasticsearch 响应中的信息,因此不再需要暴露此底层功能。spring-doc.cadn.net.cn

  • 底层方法 startScrollcontinueScrollclearScroll 已从 ElasticsearchOperations 接口中移除。 对于底层滚动 API 的访问,现在 ElasticsearchRestTemplate 类上提供了 searchScrollStartsearchScrollContinuesearchScrollClear 方法。spring-doc.cadn.net.cn