Spring Data Elasticsearch id vs. _id

我正在使用Spring Data Elasticsearch 2.0.1和Elastic版本2.2.0。

我的 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,元数据字段将正确填充。字段的 getter 和 setter 方法正确返回元数据字段的值。但该字段中的 id 字段为空。_idid_id_source

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


答案 1

由于您让ES生成自己的ID,即您从不调用,因此无法在字段中具有值。MyDao.setId("abcdxyz")_sourceid

发生的事情是,如果您生成自己的ID并调用 ,则Spring Data ES将使用它作为文档的值,并将该值保存到字段中。这意味着它不会为空。setId("yourid")_id_source.id_source.id

如果不调用 ,则将为空,ES 将生成自己的 ID。然后调用时,Spring Data ES将确保返回该字段的值,而不是因为它带有注释setId()_source.idgetId()_id_source.id@Id

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


答案 2

推荐