领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多本文延续了我们关于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.+ 版本起已被弃用。用户应切换到 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
。
代理支持。
自定义 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...
}