Spring Data Elasticsearch id与_id

wxk*_*vin 11 java elasticsearch spring-data-elasticsearch

我使用弹性版本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>
}
Run Code Online (Sandbox Code Playgroud)

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

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

Val*_*Val 12

既然你让ES生成自己的标识,也就是你永远调用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将始终填充它,即使idES中的基础字段为空也是如此.

  • 我在 id 属性中使用了 @JsonIgnore 并且该字段不是在 ES 中创建的! (2认同)