领先一步
VMware 提供培训和认证,助您加速进步。
了解更多本文是我们关于《Spring Data Neumann 新功能》博客系列文章的续篇。今天的章节将解释 Spring Data Elasticsearch 的新功能和值得关注的内容。本文由 Spring Data Elasticsearch 模块的维护者 P.J. Meisch 撰写。
此版本解决了 140 多个问题,修复了 30 多个 Bug。
Spring Data Elasticsearch 现在使用 Elasticsearch 7,特别是 7.6.2。不再支持运行在 6.x 版本的 Elasticsearch 集群。ElasticsearchTemplate 类已弃用,因为它使用 TransportClient 访问 Elasticsearch,而 TransportClient 本身已在 Elasticsearch 7+ 版本中弃用。用户应切换到 ElasticsearchRestTemplate 或 ReactiveElasticsearchTemplate。
总的来说,本次发布带来了一些可能需要更新代码和领域模型的更改。您可以在 参考文档 中找到完整的迁移指南。
底层的一个变化是将实体到 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
}
在 Elasticsearch 中,该字段将被命名为 last-name,此映射是透明处理的。
一个没有时间信息的日期的属性。
另一个属性,这次包含完整的日期和时间信息。
由于 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。
代理支持。
自定义请求头供应商,用于动态提供发送到集群的每个请求的请求头。
pathPrefix,用于 Elasticsearch 集群位于负载均衡器或调度程序后面的情况。
现在可以定义实体回调,下表显示了支持的回调:
回调
方法
描述
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...
}