删除/更新elasticsearch上的文档字段

时间:2016-01-29 12:48:07

标签: java elasticsearch

想象一个班级:

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" } 。 我无法弄清楚我做错了什么。

2 个答案:

答案 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": {}}}