我正在使用spring引导数据elasticsearch将文档持久化到elasticsearch中。
下面是我的文档对象。
@Builder
@Document(indexName = "testidx", createIndex = false)
public class Book {
@Id
private final String _id;
@NotNull
@CreatedDate
@Field(type = FieldType.Date, format = DateFormat.basic_date_time)
private final Instant regTime;
@NotNull
@Field(type = FieldType.Text)
private final String bookName;
}
但是,当我将对象保存到elasticsearchrepository中时,regtime(必须由@createddate自动创建和保存)尚未保存。
elasticRepository.save(
Book.builder()
.bookName("test")
.build()
);
GET /testidx/_search
{
"_index" : "testidx",
"_type" : "_doc",
"_id" : "M3IS_XgBGpcXDVxetXXn",
"_score" : 1.0,
"_source" : {
"_class" : "{test class Name}",
"bookName" : "test",
}
}
你能告诉我错过了什么吗?
我正在研究springboot2.4.5(以及springbootstarter数据elasticsearch 2.4.5)和elasticsearch 7.12.0。
2条答案
按热度按时间flseospp1#
请检查有关审计的文件(https://docs.spring.io/spring-data/elasticsearch/docs/4.2.0/reference/html/#elasticsearch.auditing).
您的实体需要实现
Persistable
接口,需要重新实现isNew()
方法(见第9.2.1节)。注意:我刚刚在文档实体示例中看到@CreatedDate
以及@CreatedBy
缺少注解。我会修改文件,当然需要注解。那你有吗
@EnableElasticsearchAuditing
在spring启动应用程序或任何其他配置类上?这也是需要的。gxwragnw2#
不幸的是,springdataelasticsearch不支持所有与持久性相关的注解,既不支持jpa的所有Map注解,也不支持spring数据的审计注解
@CreatedDate
属于。解决方案
所以我会放弃它,只使用基本的
@Field
注解。那你的财产呢regTime
应该在json请求中显示为上面的同级bookName
并按预期坚持下去。然而,由于没有spring数据的特殊性
@CreatedDate
注解(便于审计),您必须自己关心初始化,在持久化之前设置值,例如使用regTime = Instant.now()
(在字段定义、构造函数或其他中)。背景
请参阅6.1.1中有关元模型对象Map的文档。Map注解概述,当前(版本4.2)仅包括以下字段注解:
@Id
@Field@GeoPoint
另见官方指南8。elasticsearch存储库。以前,SimpleLasticSearchPersistentProperty中有一个枚举支持的\u id\u属性\u名称,它列出了这些字段注解。
参见类似的问题:SpringDataElasticSearch是否支持jpa中的@id注解?
本教程帮助我介绍了elasticsearch数据:spring boot elastic search示例-java开发人员专区