Spring Data Elasticsearch id与_id之间的区别

19

我正在使用Spring Data Elasticsearch 2.0.1和Elasticsearch版本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 方法会正确返回 _id 元数据字段的值。但是 _source 字段中的 id 字段为空。

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


1
你是让ES生成自己的ID还是提供自己的ID?也就是说,你是否在调用MyDao.setId("abcdxyz") - Val
1
我让ES生成自己的ID。我能否使用自动生成的ID来使ID显示在两个字段中? - wxkevin
@wxkevin 另一个问题,你能分享一下你的pom吗?我在尝试使用spring-data-elasticsearch 2时卡在了错误上。问题链接 - Utkarsh Mishra
我无法复制和粘贴,但我可以告诉您依赖项和版本号: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)。如果您需要其他特定内容,请随时提问。 - wxkevin
1个回答

21

如果您让ES自动生成其自己的ID,即从未调用MyDao.setId("abcdxyz"),那么_source字段中的id将不能有值。

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

如果您不调用setId(),则_source.id将为空,ES将生成自己的ID。当您调用getId()时,Spring Data ES将确保返回_id字段的值而不是_source.id的值,因为它被注释为@Id

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


那么您的意思是无法让Elasticsearch生成ID并将该ID用于我的ID字段? - wxkevin
1
是的,ES ID 存储在 _id 字段中,该字段与 _source.id(或您想要给该字段的任何名称)不同。最好的方法是生成自己的 ID 并调用 setId() - Val
3
我在id属性中使用了@JsonIgnore,导致该字段未在ES中创建! - Wendel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接