Elasticsearch upsert操作

Elasticsearch upsert操作教程

Elasticsearch 中,upsert 操作用于如果指定的 document 不存在,就执行 upsert 中的初始化操作;如果指定的 document 存在,就执行 doc 或者 script 指定的 partial update 操作。

Elasticsearch upsert操作详解

语法

POST indexname/_update/id { "script" : "ctx._source.num+=1", "upsert": { "field1":"value1", "field2":"value2" } }

参数

参数 描述
indexname 需要更新的索引名
id 需要更新的文档 id
field1 需要更新的字段
value1 将字段更新为的值
field2 需要更新的字段
value2 将字段更新为的值

说明

如果 id 的文档存在,则直接使用 script 进行更新,否则,则插入 upsert 里面的字段。

案例

upsert操作

我们在 Kibana 的控制台上,首先,使用 DELETE 删除索引,具体命令如下:

DELETE haicodernet

执行成功后,如下图所示:

12_Elasticsearch upsert操作.png

即,我们删除了索引 haicodernet,现在,我们直接使用 partial update 更新一个不存在的文档,具体命令如下:

POST haicodernet/_update/1 { "doc": { "index":"www.haicoder.net" } }

执行成功后,如下图所示:

13_Elasticsearch upsert操作.png

即,我们看到,此时报文档不存在异常,即,我们执行 partial update 时,必须要保证文档是存在的,现在,我们修改为使用 upsert 操作,具体命令如下;

POST haicodernet/_update/1 { "script" : "ctx._source.view_num += 1", "upsert": { "index":"www.haicoder.net", "name" : "javascript", "desc" : "javascript module", "view_num": 100 } }

更新成功后,如下图所示:

14_Elasticsearch upsert操作.png

现在,我们查看该文档的内容,具体命令如下:

GET haicodernet/_doc/1

查看结果,如下图所示:

15_Elasticsearch upsert操作.png

我们看到,此时该文档已经存在了,即我们使用了 upsert 的方式,当文档不存在时,则创建文档,现在,我们再次使用 upsert 更新一个已经存在的文档,具体命令如下:

POST haicodernet/_update/1 { "script" : "ctx._source.view_num += 1", "upsert": { "index":"www.haicoder.net", "name" : "JavaScript", "desc" : "javascript module", "view_num": 100 } }

更新成功后,如下图所示:

16_Elasticsearch upsert操作.png

我们看到,此时已经更新成功了,现在,我们查看该文档的内容,具体命令如下:

GET haicodernet/_doc/1

查看结果,如下图所示:

17_Elasticsearch upsert操作.png

我们看到,此时的 view_num 被加 1 了,变成了 101,即,upsert 如果文档存在,则更新,否则,则创建。

Elasticsearch upsert操作总结

在 Elasticsearch 中,upsert 操作用于如果指定的 document 不存在,就执行 upsert 中的初始化操作;如果指定的 document 存在,就执行 doc 或者 script 指定的 partial update 操作。