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> 包含实体以及诸如 *score*、*sortvalues*、*highlight fields* 之类的信息。

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

这些是从对 (Reactive)ElasticsearchOperations 的调用返回的。

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

@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)

标记可审计实体为 *created* 或 *modified*。

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 社区中所有即将举行的活动。

查看全部