从 3.2.x 升级到 4.0.x
本节描述了从 3.2.x 版本到 4.0.x 版本的重大更改,以及如何使用新引入的功能替换已删除的功能。
移除使用的 Jackson Mapper
4.0.x 版本中的一个更改是 Spring Data Elasticsearch 不再使用 Jackson Mapper 将实体映射到 Elasticsearch 所需的 JSON 表示形式(请参阅 Elasticsearch 对象映射)。在 3.2.x 版本中,Jackson Mapper 是使用的默认映射器。可以通过显式配置切换到基于元模型的转换器(名为 ElasticsearchEntityMapper
)(元模型对象映射)。
在 4.0.x 版本中,基于元模型的转换器是唯一可用的转换器,无需显式配置。如果您之前有自定义配置,通过提供如下 Bean 来启用元模型转换器:
@Bean
@Override
public EntityMapper entityMapper() {
ElasticsearchEntityMapper entityMapper = new ElasticsearchEntityMapper(
elasticsearchMappingContext(), new DefaultConversionService()
);
entityMapper.setConversions(elasticsearchCustomConversions());
return entityMapper;
}
您现在必须移除此 Bean,ElasticsearchEntityMapper
接口已被移除。
一些用户在实体类上使用了自定义 Jackson 注解,例如为了定义 Elasticsearch 中映射文档的自定义名称或配置日期转换。这些注解不再被考虑。现在 Spring Data Elasticsearch 的 @Field
注解提供了所需的功能。有关详细信息,请参阅 映射注解概览。
从查询对象中移除隐式索引名称
在 3.2.x 版本中,不同的查询类(如 IndexQuery
或 SearchQuery
)具有用于获取其操作的索引名称或索引名称的属性。如果这些属性未设置,则会检查传入的实体以检索在 @Document
注解中设置的索引名称。
在 4.0.x 版本中,索引名称现在必须在类型为 IndexCoordinates
的附加参数中提供。通过这种分离,现在可以使用一个查询对象针对不同的索引。
例如,以下代码:
IndexQuery indexQuery = new IndexQueryBuilder()
.withId(person.getId().toString())
.withObject(person)
.build();
String documentId = elasticsearchOperations.index(indexQuery);
必须更改为:
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)
;
新的 Operations 接口
在 3.2 版本中,存在 ElasticsearchOperations
接口,该接口定义了 ElasticsearchTemplate
类的所有方法。在 4 版本中,这些函数已拆分为不同的接口,使这些接口与 Elasticsearch API 保持一致。
-
DocumentOperations
是与文档相关的函数,例如保存或删除。 -
SearchOperations
包含在 Elasticsearch 中搜索的函数。 -
IndexOperations
定义了操作索引的函数,例如索引创建或映射创建。
ElasticsearchOperations
现在扩展了 DocumentOperations
和 SearchOperations
,并具有访问 IndexOperations
实例的方法。
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 中显示了它们应该替换的内容。
/*
* 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);
移除内容
-
如前所述,
ElasticsearchEntityMapper
接口已被移除。 -
SearchQuery
接口已合并到其基接口Query
中,因此其出现位置只需替换为Query
。 -
方法
org.springframework.data.elasticsearch.core.ElasticsearchOperations.query(SearchQuery query, ResultsExtractor<T> resultsExtractor);
和org.springframework.data.elasticsearch.core.ResultsExtractor
接口已被移除。这些方法可用于解析 Elasticsearch 的结果,用于基于 Jackson 的映射器无法完成响应映射的情况。从 4.0 版本开始,提供了新的 搜索结果类型 来返回 Elasticsearch 响应中的信息,因此无需公开此底层功能。 -
底层方法
startScroll
、continueScroll
和clearScroll
已从ElasticsearchOperations
接口中移除。对于底层滚动 API 访问,现在ElasticsearchRestTemplate
类中提供了searchScrollStart
、searchScrollContinue
和searchScrollClear
方法。