Spring Data Elastic 从 3.x 迁移到 4.x 的索引问题

2024-04-01

在我们使用的整体应用程序中JHIPSTER-6.10.5,我们正在使用Spring-Data-Elastic 版本:3.3.1 with 弹性搜索版本:6.8.8。我们有多个@ManyToOne and @OneToMany与 100 多个实体建立关系。 在某些情况下,最多可以相互引用 7 个实体(我的意思是相互关联,而不仅仅是一个实体与另一个实体之间的相互关联)。 对于弹性搜索,我们一直在使用

  1. 忽略索引:@JsonIgnoreProperities(value = { "unwanted fields" }, allowSetters = true) and @JsonIgnore不需要的地方
  2. 映射关系: onManyToOne我们用的是@JsonBackReference与相应的@JsonManagedReference就各自的OneToMany关系。

现在我们正在迁移到 Jhipster-7.0.1 并开始看到以下问题:

  1. 新的 Spring-Data-Elastic 版本:4.1.6 和 Elastic Search 版本:7.9.3
  2. Now with Spring data elastic, the Jackson based mapper is not available we are seeing multiple StackOverflow errors. Below is the migration change we did on the annotations:
    1. 关于我们添加的关系@Field(type = FieldType.Nested, ignoreMalformed = true, ignoreFields = {"unwanted fields"})。这在 Spring 数据级别停止了 StackOverflow 错误,但仍然在内部弹性休息客户端级别抛出 StackOverflow 错误。所以,我们被迫使用@Transient排除所有的OnetoMany关系。
    2. Even on ManyToOne与上述的关系@Field注释目前我们面临着elasticsearchException,“索引[]中的总字段[1000]的限制已被超出”
    3. 我尝试按照以下文档进行操作弹簧数据 https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#reference,但无法解决。
    4. 我们还保留了 Jhipster 生成的 Json(Jackson) 注释,但它们没有任何效果。

我们目前陷入停滞,因为我们不确定如何解决这些问题;就我个人而言,使用 Json 注释非常方便且有据可查;我们对 Elastic Search 和 Spring Data Elastic Search 都很陌生,在过去 8 个月内才开始使用它,无法弄清楚如何修复这些错误。 请询问我是否遗漏了任何需要的信息。我会在不违反组织政策的情况下分享尽可能多的内容。

gitter 上请求的示例代码存储库:https://gitlab.com/thelearner214/spring-data-es-sample https://gitlab.com/thelearner214/spring-data-es-sample

先感谢您


查看您在 gitter 上链接的存储库(您可以考虑在此处添加链接)。

第一:@Field注解用于编写索引映射和ignoreFields构建映射时需要属性来打破循环引用。这是not当实体写入 Elasticsearch 时使用。

例如,会发生什么情况Address and Customer写入 Elasticsearch 期间的实体:Customer文档有Addresses,因此这些地址被转换为嵌入在Customer文档。但是Address has a Customer,所以在写地址时Customer被嵌入到这个Address元素已经是客户的子文档。

我想Customers 不应存储在Address反之亦然。所以你需要将这些嵌入文档标记为@org.springframework.data.annotation.Transient,你不需要@Field对它们进行注释,因为您不想将它们作为属性存储在索引中。

Spring Data Elasticsearch 不再使用 Jackson 注释。

这里使用的方法的基本问题是来自关系世界的建模 - 使用(一|多)对{一|多)关系链接和连接不同的表,通过 ORM 在 Java 对象图中体现映射器 - 用于不使用这些概念的基于文档的数据存储。

它曾经在您之前的版本中工作,因为 Spring Data Elasticsearch 的旧版本也使用 Jackson,所以这些字段在编写时被跳过,现在您必须添加@Transient注释是 Spring Data 注释。

但我不知道如何@Transient可能会干扰 Spring Data JPA - 另一点表明对不同的存储使用相同的 Java 类不是一个好主意

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Data Elastic 从 3.x 迁移到 4.x 的索引问题 的相关文章

随机推荐