Spring Data 2020.0 - Spring Data Elasticsearch 4.1 的新增功能和重要特性

工程 | Christoph Strobl | 2020 年 11 月 24 日 | ...

Spring Data Elasticsearch 是随附于 2020.0 版本发布的社区模块之一。代表目前承担大部分繁重工作的 P.J. Meisch,我们很高兴分享他对当前版本的见解。

上一个版本对内部代码结构和 API 进行了重大调整,而 Spring Data Elasticsearch 的 2020.0 版本则专注于修复错误和添加功能。

总共修复了 23 个错误并解决了 81 个其他问题。Spring Data Elasticsearch 现在使用实际的 Elasticsearch 7.9.3 版本构建。

这篇博文展示了 Spring Data Elasticsearch 4.1 版本中添加的最重要的功能。

索引管理

此版本添加了缺失的部分,以便在应用程序内部提供索引管理功能,特别是别名处理和索引模板。

别名处理

IndexOperations 接口中的别名处理方法已重新设计,以遵循 Elasticsearch 用于处理别名的 API。我们现在提供 Elasticsearch API 中包含的所有别名操作。

索引模板

Elasticsearch 中的索引模板结合索引名称模式定义映射、设置和别名信息。因此,可以为像 "log-*" 这样的索引名称模式定义一个模板,并且每当创建像 "log-2020-11-01" 这样的索引时,预定义的映射、设置和别名设置都会自动应用到该索引。

Spring Data Elasticsearch 现在支持索引模板的管理,因此创建索引时用于映射和设置的相同实体注解也被用于定义索引模板。

通过此索引管理,现在可以实现索引命名策略,例如基于时间的滚动索引。

索引管理功能现在可用于响应式设置以及非响应式设置。

嵌套 Criteria 定义

在 Spring Data Elasticsearch 中定义查询的一种方法是使用 Criteria 查询 API。它提供了一种流畅、类似语言的语法。

Criteria criteria = new Criteria("lastName").is("Smith")
    .and("firstName").is("Emma");
Query query = new CriteriaQuery(criteria);

到目前为止,使用此 API 无法构建嵌套查询。如果用户想搜索姓氏为 Smith 且名字为 EmmaLucy 的所有人员,可以使用以下查询

Criteria criteria = new Criteria("lastName").is("Smith")
    .and("firstName").is("Emma")
    .or("firstName").is("Lucy");

但这将返回 Emma Smith 而不是 Lucy,因为它将被映射为“必须是 Smith 并且必须是 Emma 并且应该(should)是 Lucy”。

我们现在支持嵌套 Criteria 定义

Criteria emmaOrLucy = new Criteria()
    .or("firstName").is("Emma")
    .or("firstName").is("Lucy");
Criteria criteria = new Criteria("lastName").is("Smith")
    .subCriteria(emmaOrLucy);

通过这些子 Criteria,现在可以在不使用 NativeSearchQueryStringQuery 的情况下构建任意嵌套的复杂查询。

geo_shape 支持

Spring Data Elasticsearch 现在最终支持 geo_shape 数据类型。如果实体的属性派生自新引入的 GeoJson 接口或使用 @GeoShapeField 注解进行标注,则现在该属性会被解释为 geo_shape 属性。

Spring Data Elasticsearch 为 GeoJson 接口提供了以下实现

  • GeoJsonPoint

  • GeoJsonMultiPoint

  • GeoJsonMultiLineString

  • GeoJsonPolygon

  • GeoJsonMultiPolygon

  • GeoJsonGeometryCollection

对于使用 @GeoShapeField 注解标注但未实现 GeoJson 的属性,必须提供自定义转换器用于在 Document 对象或 String 之间进行转换。

在以下地方考虑 geo_shape 属性

1. 映射定义

定义为 geo_shape 的属性将以 geo_shape 类型写入索引映射,以便 Elasticsearch 将数据识别为 GeoJson 数据。

2. 属性映射

当具有 geo_shape 类型属性的文档写入 Elasticsearch 时,该属性将转换为相应的 GeoJSON 表示形式;当读取搜索响应时,将实例化相应的 GeoJson 派生类型。因此,geo_shape 类型可以在实体中像其他任何属性类型一样使用。

3. criteria 查询

可以使用 NativeSearchQueryQueryString 类构建针对 geo_shape 属性的查询;此外,Criteria 接口现在也包含用于构建此类查询的方法,例如

CriteriaQuery query = new CriteriaQuery(new Criteria("area").intersects(geoShape));

其中 area 是一个 geo_shape 属性,而 geoShapeGeoJson 类型的某个变量。

用于 geo_shape 条件的 Criteria 方法包括 withinintersectsisDisjointcontains,这些与 Elasticsearch 为 geo_shape 查询提供的方法相同。

还有什么?

  • 在 4.0 版本中引入的审计支持现在在响应式栈中也得到了完全支持。

  • 当使用内嵌命中(inner hits)进行嵌套查询时,内嵌命中现在在 SearchHit 对象中返回。

这是对 Spring Data Elasticsearch 4.1 主要变化的一个简短概述,希望您喜欢使用它!

订阅 Spring 新闻通讯

订阅 Spring 新闻通讯,保持连接

订阅

抢占先机

VMware 提供培训和认证,助您快速进步。

了解更多

获取支持

Tanzu Spring 通过一项简单的订阅提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部