领先一步
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
的调用中返回。
要在 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...
}