摘要
最近我们升级到了Spring Data Elasticsearch 4.x。此次主要发布的一部分意味着我们不再使用Jackson将我们的领域对象转换为json(改用MappingElasticsearchConverter
)[1]。这意味着我们现在必须为所有文档添加一个新的id
字段。
以前,我们的领域对象如下:
import org.springframework.data.annotation.Id;
public ESDocument {
@Id
private String id;
private String field1;
@JsonIgnore
public String getId() {
return id;
}
public String getField1() {
return field1;
}
这导致了ES中像这样的文档:
{
"_index" : "test_index",
"_type" : "_doc",
"_id" : "d5bf7b5c-7a44-42f9-94d6-d59fe3988482",
"_score" : 1.0,
"_source" : {
"field1" : "blabla"
}
}
注意:
1. `@JsonIgnore` 注解用于确保我们不必在 `_source` 中拥有一个 `id` 字段。 2. 我们自己设置文档的 id,并且它最终在 `_id` 中。
问题
使用 Spring Data Elastic 4.x,`@JsonIgnore` 注解不再受到尊重,这意味着我们现在被迫在 `_source` 中拥有一个 `id` 字段,如下所示:
{
"_index" : "test_index",
"_type" : "_doc",
"_id" : "d5bf7b5c-7a44-42f9-94d6-d59fe3988482",
"_score" : 1.0,
"_source" : {
"id": "d5bf7b5c-7a44-42f9-94d6-d59fe3988482",
"field1" : "blabla"
}
}
问题
- 现在是否不再可能省略文档标识符的重复(即在
_id
和id
字段中)?如果可以,如何操作?(请注意,我们已经尝试了@org.springframework.data.annotation.Transient
,但它无法正常工作,因为spring-data-elastic认为我们的文档没有id)。 - 我们之前抑制
_source
中的id
字段的方法是错误或有问题吗?
版本
java:1.8.0_252
elasticsearch:7.6.2
spring-boot:2.3.1.RELEASE
spring-data-elastic:4.0.1.RELEASE
参考资料
[1] - https://spring.io/blog/2020/05/27/what-s-new-in-spring-data-elasticsearch-4-0
id
字段将始终存在于文档中。但是,如果您不想要它,则可以从映射中删除它,或者您可以使用查询来获取文档并排除id
字段。参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-source-field.html#include-exclude - Harshit_source.id
字段。谢谢链接。 - Oliver Henlich