gpt4 book ai didi

java - Spring Data Elasticsearch (4.x) - 在 _source 中使用 @Id 强制 id 字段

转载 作者:行者123 更新时间:2023-12-01 13:37:09 46 4
gpt4 key购买 nike

概括
最近我们升级到 Spring Data Elasticsearch 4.x。这个主要版本的一部分意味着不再使用 Jackson 将我们的域对象转换为 json(使用 MappingElasticsearchConverter 代替)[1]。这意味着我们现在被迫添加一个新的 id我们所有文件的字段。
以前我们有这样的域对象:

import org.springframework.data.annotation.Id;

public ESDocument {
@Id
private String id;

private String field1;

@JsonIgnore
public String getId() {
return id;
}

public String getField1() {
return field1;
}
这导致ES中的文件如下:
{
"_index" : "test_index",
"_type" : "_doc",
"_id" : "d5bf7b5c-7a44-42f9-94d6-d59fe3988482",
"_score" : 1.0,
"_source" : {
"field1" : "blabla"
}
}
注意:
  • @JsonIgnore用于确保我们是 的注释不是 需要有 id _source 中的字段.
  • 我们自己设置文档 ID,它最终在 _id .

  • 问题
    使用 Spring Data Elastic 4.x @JsonIgnore不再尊重注释,这意味着我们现在被迫拥有 id _source 中的字段如下所示:
    {
    "_index" : "test_index",
    "_type" : "_doc",
    "_id" : "d5bf7b5c-7a44-42f9-94d6-d59fe3988482",
    "_score" : 1.0,
    "_source" : {
    "id": "d5bf7b5c-7a44-42f9-94d6-d59fe3988482",
    "field1" : "blabla"
    }
    }
    问题
  • 是否不再可能省略文档标识符的重复(即在 _idid 字段中)?如果有怎么办? (请注意,我们已经尝试了 @org.springframework.data.annotation.Transient,它不起作用,因为 spring-data-elastic 认为我们的文档没有 id)。
  • 是我们之前抑制 id 的方法吗? _source 中的字段不正确或有问题?

  • 版本
    java :1.8.0_252
    Elasticsearch :7.6.2
    Spring 启动:2.3.1.RELEASE
    Spring 数据弹性:4.0.1.RELEASE
    引用
    [1] - https://spring.io/blog/2020/05/27/what-s-new-in-spring-data-elasticsearch-4-0

    最佳答案

    问题一:
    要从 _source 中省略 id 字段,您通常会使用 @Transient注释,但正如您所写,这不适用于 id 属性。在 Spring Data 模块(不仅是 Spring Data Elasticsearch)中忽略 transient 属性。
    但是你可以使用 org.springframework.data.annotation.ReadOnlyProperty对此的注释:

    @Id
    @ReadOnlyProperty
    private String id;
    老实说,到目前为止我还不知道它存在,它也来自 Spring Data Commons,并在 isWriteable() 中进行了检查。属性由 MappingElasticsearchConverter 写入时的属性方法.
    问题二:
    当然不是不正确的,但正如你发现的那样有问题。我们在存储时总是考虑整个实体,所以我们从来没有想过不写id。严格来说,没有必要,你是对的,因为我们总是在 _id 字段中将 id 与 _source 一起取回,所以我们可以轻松地将实体重新组合在一起,但我们从未认为这是一个必要的特性.
    注:
    当您查看 ES 索引中的数据时,您会发现 MappingElasticsearchConverter编写了一个名为 _class 的附加 _source 字段,其中包含实体类的名称(或定义的别名)。这允许映射泛型;更多信息 check the documentation - 以防万一你想知道这是从哪里来的。

    关于java - Spring Data Elasticsearch (4.x) - 在 _source 中使用 @Id 强制 id 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62765711/

    46 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com