elasticsearch的更新功能是非常强大的,一直知道在update中有一个upsert功能,因为一直用不到也就没有去仔细看一下,最近,因为有业务可能要用到该功能,这里简单的说一下:
通过curl去更新数据如下:
curl -XPOST 'localhost:9200/test/type1/1/_update' -d '{ "doc" : { "name" : "new_name" }, "upsert" : { "counter" : 1 } }'上面的例子就是实现_id为1的文档的更新操作,如果_id为1的文档存在,则去更新doc中的内容,如果不存在,则将upsert中的内容插入进去.这里需要注意,如果doc中要更新的字段,比如name不存在,则会将这个name数据插入进去.当然,如果配置了禁止动态生成mapping,则会失败.
java中的代码实现,如下:
IndexRequest indexRequest = new IndexRequest("index", "type", "1")
.source(jsonBuilder()
.startObject()
.field("name", "Joe Smith")
.field("gender", "male")
.endObject());
UpdateRequest updateRequest = new UpdateRequest("index", "type", "1")
.doc(jsonBuilder()
.startObject()
.field("gender", "male")
.endObject())
.upsert(indexRequest);
client.update(updateRequest).get();