在 Elasticsearch 中,upsert 操作用于如果指定的 document 不存在,就执行 upsert 中的初始化操作;如果指定的 document 存在,就执行 doc 或者 script 指定的 partial update 操作。
POST indexname/_update/id { "script" : "ctx._source.num+=1", "upsert": { "field1":"value1", "field2":"value2" } }
参数 | 描述 |
---|---|
indexname | 需要更新的索引名 |
id | 需要更新的文档 id |
field1 | 需要更新的字段 |
value1 | 将字段更新为的值 |
field2 | 需要更新的字段 |
value2 | 将字段更新为的值 |
如果 id 的文档存在,则直接使用 script 进行更新,否则,则插入 upsert 里面的字段。
我们在 Kibana 的控制台上,首先,使用 DELETE 删除索引,具体命令如下:
DELETE haicodernet
执行成功后,如下图所示:
即,我们删除了索引 haicodernet,现在,我们直接使用 partial update 更新一个不存在的文档,具体命令如下:
POST haicodernet/_update/1 { "doc": { "index":"www.haicoder.net" } }
执行成功后,如下图所示:
即,我们看到,此时报文档不存在异常,即,我们执行 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 } }
更新成功后,如下图所示:
现在,我们查看该文档的内容,具体命令如下:
GET haicodernet/_doc/1
查看结果,如下图所示:
我们看到,此时该文档已经存在了,即我们使用了 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 } }
更新成功后,如下图所示:
我们看到,此时已经更新成功了,现在,我们查看该文档的内容,具体命令如下:
GET haicodernet/_doc/1
查看结果,如下图所示:
我们看到,此时的 view_num 被加 1 了,变成了 101,即,upsert 如果文档存在,则更新,否则,则创建。
在 Elasticsearch 中,upsert 操作用于如果指定的 document 不存在,就执行 upsert 中的初始化操作;如果指定的 document 存在,就执行 doc 或者 script 指定的 partial update 操作。