Spring Data Elasticsearch嵌套关联实体存储的保存顺序问题咨询
Spring Data Elasticsearch nested对象保存问题解答
结论
你给出的保存顺序完全错误,不符合Elasticsearch nested类型的存储逻辑。
错误原因
Elasticsearch的nested类型是将嵌套对象作为父文档的内置属性,和父文档存储在同一个ES文档中,不存在关系型数据库的外键关联逻辑。你当前给3个实体都加了@Document(indexName = "product-store")注解,如果按你说的步骤分别保存,会在索引中生成3个完全独立的文档,不会自动组装成同一个嵌套结构的文档。
正确实现方案
前置代码调整
- 去掉
Product、ProductExperience类上的@Document注解,二者是嵌套对象,不需要作为独立文档实体 - 不需要为
Product、ProductExperience创建独立的Repository,仅保留Category的Repository即可
正确保存流程
- 第一步:创建所有需要关联的
ProductExperience(评论)实体,无需单独保存 - 第二步:将对应评论集合设置到所属
Product实体的productExperience字段中,Product实体也无需单独保存 - 第三步:将所有关联的
Product集合设置到Category实体的products字段中 - 第四步:仅调用Category的Repository的save方法保存最终组装好的Category对象,即可将完整的三级嵌套结构作为单个ES文档存入索引
额外说明
如果你的业务需求需要单独查询Product、单独更新评论数据,nested嵌套方案并不是最优选择,你可以改用ES的join类型实现父子文档关联。
内容的提问来源于stack exchange,提问作者e2rabi
相关产品推荐
相关产品推荐

