【问题标题】:Spring Data Elasticsearch id vs. _idSpring Data Elasticsearch id 与 _id
【发布时间】:2016-09-13 14:33:15
【问题描述】:

我正在使用带有 Elastic 版本 2.2.0 的 Spring Data Elasticsearch 2.0.1。

我的 DAO 类似于:

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;    

@Document(indexName = "myIndex")
public class MyDao {
    @Id
    private String id;

    public String getId() { return id; }
    public void setId(String id) { this.id = id; }

    <other fields, setters, getters omitted>
}

使用存储库将对象保存到 ES,_id 元数据字段会正确填充。 id 字段的 getter 和 setter 方法正确返回 _id 元数据字段的值。但是_source字段中的id字段为空。

2 个问题: 1) 为什么 id 字段为空? 2) id 字段是否为空有关系吗?

【问题讨论】:

  • 您是让 ES 生成自己的 ID 还是提供自己的 ID?即你是否在打电话给MyDao.setId("abcdxyz")
  • 我让 ES 生成它自己的 ID。我可以使用自动生成 ID 来让 ID 显示在两个字段中吗?
  • @wxkevin 一个不同的问题,但你能分享你的 pom.xml 吗?我在尝试使用 spring-data-elasticsearch 2 时遇到错误:question-link
  • 我无法复制和粘贴,但我可以告诉你依赖项和版本号:spring-core (4.2.5.RELEASE)、spring-webmvc (4.2.5.RELEASE)、javax。 servlet-api (3.1.0)、elasticsearch (2.2.0)、spring-data-elasticsearch (2.0.1.RELEASE)、jcl-over-slf4j (1.7.16)、logback-classic (1.1.5)。如果您需要其他具体内容,请随时提出。

标签: java elasticsearch spring-data-elasticsearch


【解决方案1】:

由于您让 ES 生成自己的 ID,即您永远不会调用 MyDao.setId("abcdxyz"),因此 _source 不能在 id 字段中具有值。

发生的情况是,如果您生成自己的 ID 并调用 setId("yourid"),那么 Spring Data ES 会将其用作文档的 _id 的值,并将该值保存到 _source.id 字段中。这意味着_source.id 不会为空。

如果你不调用setId(),那么_source.id将为null,ES会生成自己的ID。然后当您调用getId() 时,Spring Data ES 将确保返回_id 字段的值而不是_source.id,因为它带有@Id 注释

要回答您的第二个问题,_source.id 字段是否为空并不重要...只要您不需要引用它即可。在将 JSON 文档映射到 Java 实体时,Spring Data ES 将始终填充它,即使 ES 中的底层 id 字段为空。

【讨论】:

  • 所以你是说没有办法让 Elasticsearch 生成 ID 并在我的 id 字段中使用该 ID?
  • 是的,ES ID 存储在 _id 字段中,该字段不同于 _source.id(或您想为该字段指定的任何名称)。最好的方法是生成自己的 ID 并调用setId()
  • 我在id属性中使用了@JsonIgnore,并且该字段不是在ES中创建的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 2018-02-01
  • 2014-09-22
  • 2023-04-08
相关资源
最近更新 更多