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
字段为空。
我正在使用 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
字段为空。