Spring Data 2020.0 - Spring Data Elasticsearch 4.1 新特性

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

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

之前的版本包含对内部代码结构和 API 的重大改动,而 2020.0 版本的 Spring Data Elasticsearch 主要关注于修复 bug 和添加功能。

总共修复了 23 个 bug 和 81 个其他问题。Spring Data Elasticsearch 现在使用的是 Elasticsearch 7.9.3 版本。

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

索引管理

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

别名处理

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

索引模板

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

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

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

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

嵌套条件定义

在 Spring Data Elasticsearch 中定义查询的方法之一是使用Criteria 查询 API。它允许使用流畅的、类似语言的语法。

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

到目前为止,使用此 API 无法构建嵌套查询。如果用户要搜索所有姓氏为“Smith”且名字为“Emma”或“Lucy”的人,可以使用以下查询:

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

但这只会返回“Emma Smith”,而不会返回“Lucy”,因为这将映射为“必须是 Smith 并且必须是 Emma 并且应该是 Lucy”。

我们现在支持嵌套条件定义。

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

使用这些子条件,现在可以构建任意嵌套的复杂查询,而无需使用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. 条件查询

可以使用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 版本中引入的审计支持现在也完全支持响应式堆栈。

  • 当嵌套查询包含内部命中时,内部命中现在将返回在SearchHit 对象中。

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

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加快您的进度。

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部