Spring Data Elasticsearch 4.0 新特性

工程技术 | Mark Paluch | 2020 年 5 月 27 日 | ...

这篇文章继续了我们关于 Spring Data Neumann 新特性 的系列博文。今天的这一篇将解释 Spring Data Elasticsearch 的新增与值得关注之处。这篇博文由维护 Spring Data Elasticsearch 模块的 P.J. Meisch 撰写。

此版本解决了 140 多个问题,其中包括 30 多个错误修复。

Spring Data Elasticsearch 现在使用 Elasticsearch 7,特别是 7.6.2 版本。不再支持运行在 6.x 版本上的 Elasticsearch 集群。ElasticsearchTemplate 类已被弃用,因为它使用 TransportClient 访问 Elasticsearch,而 TransportClient 自 Elasticsearch 7.+ 版本起本身就已弃用。用户应切换到 ElasticsearchRestTemplateReactiveElasticsearchTemplate

总的来说,此版本带来了一些变更,可能需要对您的代码和领域模型进行一些更新。您可以在参考文档中找到完整的迁移指南。

改进的对象映射和实体定义

底层的一个变化是,将实体映射到 elasticsearch 所需的 JSON 文档的方式从使用 Jackson 切换到了 MappingElasticsearchConverter。现在可以为属性定义自定义名称,甚至可以为时间相关属性定义不同的日期格式,而不会出现以前版本中常见的问题。MappingElasticsearchConverter 不仅转换实体,还用于构建查询和处理搜索结果。通过这种方式,映射和转换被一致地应用于整个存储和搜索过程。

@Field 注解现在支持几乎所有可以在 Elasticsearch 中使用的类型。

@Document(indexName = "person", type = "dummy")
public class Person implements Persistable<Long> {

    @Nullable @Id
    private Long id;

    @Nullable @Field(value = "last-name", type = FieldType.Text, fielddata = true)
    private String lastName;      (1)

    @Nullable @Field(name = "birth-date", type = FieldType.Date, format = DateFormat.basic_date)
    private LocalDate birthDate;  (2)

    @CreatedDate
    @Nullable @Field(type = FieldType.Date, format = DateFormat.basic_date_time)
    private Instant created;      (3)

    // other properties, getter, setter
}
  1. 在 Elasticsearch 中,此字段将被命名为 last-name,这种映射是透明处理的

  2. 一个没有时间信息的日期属性

  3. 这一次是另一个包含完整日期和时间信息的属性

新的返回类型

由于 Elasticsearch 在搜索结果中不仅返回找到的实体,还返回许多附加信息,因此引入了新的类来提供这些信息,其中最重要的是

  • SearchHit<T> 包含实体以及诸如 scoresortvalues高亮字段 (highlight fields) 等信息

  • SearchHits<T> 包含搜索的 maxScore、返回的 aggregationstotalCount 以及 SearchHit<T> 元素的列表。

这些信息从对 (Reactive)ElasticsearchOperations 的调用中返回。

要在 repository 方法中使用它们,只需将它们定义为返回类型即可(repository 也支持分页请求)。由于现在可以在 SearchHit 中访问高亮值,repository 方法现在可以像第一个方法所示那样配置高亮。

@Highlight(fields = {@HighlightField(name = "firstName")})
List<SearchHit<Person>> findByFirstName(String firstName);

Stream<SearchHit<Person>> findByBirthDateAfter(LocalDate date);

SearchHits<Person> findByLastName(String lastName);

SearchPage<Person> searchByLastName(String name, Pageable pageable);

当然,仍然可以通过将返回类型定义为 List<Person> 来仅检索实体。

附加配置选项

响应式和非响应式客户端都可以通过附加参数进行配置

  • 支持 SSL,可选使用自定义的 SSLContext

  • 支持代理

  • 自定义 header 供应商,为发送到集群的每个请求动态提供 header

  • 用于 Elasticsearch 集群位于负载均衡器或调度器之后的场景的 pathPrefix

实体回调和审计

现在可以定义实体回调,下表显示了支持的回调

回调

方法

描述

ReactiveBeforeConvertCallback
BeforeConvertCallback

onBeforeConvert(T, IndexCoordinates)

在域对象转换为 Document 之前调用。
可以返回 entity 或修改后的实体,然后将其转换。

ReactiveAfterConvertCallback
AfterConvertCallback

onAfterConvert(T, Document, IndexCoordinates)

在域对象从 Document 转换后调用
从 Elasticsearch 读取结果数据时。

ReactiveAuditingEntityCallback
AuditingEntityCallback

onBeforeConvert(Object, IndexCoordinates)

将一个可审计实体标记为创建修改

ReactiveAfterSaveCallback
AfterSaveCallback

T onAfterSave(T, IndexCoordinates)

在域对象保存后调用。

AuditingEntityCallback 的基础上构建了审计支持。通过实现 Persistable<T> 并添加带注解的属性,这些值将自动维护存储在 Elasticsearch 中的实体。

@Document(indexName = "person")
public class Person implements Persistable<Long> {

    @Nullable @Id
    private Long id;

    @CreatedDate
    @Nullable @Field(type = FieldType.Date, format = DateFormat.basic_date_time)
    private Instant created;

    @Nullable @CreatedBy
    private String createdBy;

    @LastModifiedDate
    @Nullable @Field(type = FieldType.Date, format = DateFormat.basic_date_time)
    private Instant lastModified;

    @Nullable @LastModifiedBy
    private String lastModifiedBy;

    @Nullable
    public Long getId() { return id; }

    @Override
    public boolean isNew() { return id == null || (createdBy == null && created == null); }

    // other properties, getter, setter...
}

获取 Spring 邮件列表

订阅 Spring 邮件列表,保持联系

订阅

领先一步

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

了解更多

获得支持

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

了解更多

即将举行的活动

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

查看全部