Spring 数据 Elasticsearch id 与 _id

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,_id 元数据字段得到正确填充。 id 字段的 getter 和 setter 方法正确 return _id 元数据字段的值。但是 _source 字段中的 id 字段为空。

2个问题: 1)为什么id字段为空? 2) id 字段为空是否重要?

由于您让 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 将确保 return 您使用 _id 字段的值而不是 _source.id,因为它用 [= 注释22=]

回答你的第二个问题,_source.id 字段为空并不重要...只要你不需要引用它。 Spring 将 JSON 文档映射到您的 Java 实体时,数据 ES 将始终填充它,即使 ES 中的基础 id 字段为空。