想象一个班级:
save()
我可以创建一个class DummyClass
{
String field1;
String field2;
}
对象并将其保存在ES:
DummyClass
DummyClass dummy = new DummyClass();
dummy.field1 = "sample1";
dummy.field2 = "sample2";
byte[] source = this.jacksonMapper.writeValueAsBytes(dummy);
this.elasticsearchResources.getElasticsearchClient()
.prepareIndex()
.setIndex("index")
.setType("type")
.setSource(source)
.request();
的内容是:
source
所以,我需要做一些更改,例如:{
"field1": "sample1",
"field2": "sample2"
}
,所以我需要删除dummy.field1 = null
(我不希望ES设置field1
)。
所以,我试过这个:
field1 = null
dummy.field1 = null;
byte[] source = this.jacksonMapper.writeValueAsBytes(dummy);
this.elasticsearchResources.getElasticsearchClient()
.prepareUpdate()
.setIndex("index")
.setType(type)
.setId(id.toString())
.setDoc(source)
.setUpsert(source)
.setDetectNoop(true)
.request();
的内容是:
source
之后,ES不会从文档中删除{
"field2": "sample2"
}
。
我无法弄清楚我做错了什么。
答案 0 :(得分:2)
如果您使用的是Java SDK,则UpdateRequest仅执行合并或部分更新。为了进行替换,请使用IndexRequest,如果文档已经存在,则覆盖。
答案 1 :(得分:0)
如前所述,如果再次编制索引,ElasticSearch会替换该文档。以下应该做你想做的事:
PUT idx/tpy/1
{"name1" : "value1", "name2" : "value2"}
POST idx/tpy/_search
{"query": {"match_all": {}}}
PUT idx/tpy/1
{"name1" : "value1"}
POST idx/tpy/_search
{"query": {"match_all": {}}}