Elasticsearch更新文档

Elasticsearch更新文档教程

Elasticsearch 中,要更新一个文档,有两种方法,即,使用 PUT 方法直接覆盖原来的记录与使用 POST 修改文档的具体的字段信息。

全局替换详解

语法

PUT indexname/_doc/id { }

参数

参数 描述
indexname 需要替换的索引名
id 需要替换的文档 id

原理

一般对应到应用程序中,每次的执行流程基本是这样的:

  1. 应用程序先发起一个 get 请求,获取到 document,展示到前台界面,供用户查看和修改。
  2. 用户在前台界面修改数据,发送到后台。
  3. 后台代码,会将用户修改的数据在内存中进行执行,然后封装好修改后的全量数据。
  4. 然后发送 PUT 请求,到 Elasticsearch 中,进行全量替换。
  5. Elasticsearch 将老的 document 标记为 deleted,然后重新创建一个新的 document。

更新字段(partial update)详解

语法

POST indexname/_update/id { "doc": { "field1":"value1", "field2":"value2" ... } }

参数

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

说明

看起来,好像就比较方便了,每次就传递少数几个发生修改的 field 即可,不需要将全量的 document 数据发送过去。

partial update实现原理

Elasticsearch 内部对 partial update 的实际执行,跟传统的全局替换方式是几乎一样的。

  1. 内部先获取 document。
  2. 将传过来的 field 更新到 document 的 json 中。
  3. 将老的 document 标记为 deleted。
  4. 将修改后的新的 document 创建出来。

partial update优点

  1. 所有的查询,修改和写回操作,都发生在 Elasticsearch 中的一个 shared 内部,避免了所有的网络数据传输的开销,大大提升了性能。
  2. 减少了查询和修改中的时间间隔,可以有效减少并发冲突的情况。

案例

全局替换文档

我们在 Kibana 的控制台上,输入以下代码,新建一个文档

PUT haicodernet/_doc/1 { "index":"www.haicoder.net", "name" : "javascript", "desc" : "javascript module", "categorys" : 5, "author" : "jobs steven", "tags": [ "javascript", "vue" ] }

输入完成后,我们点击运行按钮,输出了最终的运行结果,如下图所示:

01_Elasticsearch更新文档.png

我们看到,此时我们创建文档成功了,现在,我们使用全局替换的方式,更新文档,具体代码如下:

PUT haicodernet/_doc/1 { "index":"haicoder.net", "name" : "javascript", "desc" : "javascript module", "categorys" : 5, "author" : "jobs steven", "tags": [ "javascript", "vue" ] }

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

02_Elasticsearch更新文档.png

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

GET haicodernet/_doc/1

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

03_Elasticsearch更新文档.png

我们看到,此时 index 字段的值已经被修改为了 haicoder.net 了。

更新文档字段

我们在 Kibana 的控制台上,输入以下代码,新建一个文档:

PUT haicodernet/_doc/2 { "index":"www.haicoder.net", "name" : "javascript", "desc" : "javascript module", "categorys" : 5, "author" : "jobs steven", "tags": [ "javascript", "vue" ] }

输入完成后,我们点击运行按钮,输出了最终的运行结果,如下图所示:

04_Elasticsearch更新文档.png

我们看到,此时我们创建文档成功了,现在,我们使用局部更新的方式,更新文档的指定字段的值,具体代码如下:

POST haicodernet/_update/2 { "doc": { "index":"haicoder.net", "name":"JavaScript" } }

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

05_Elasticsearch更新文档.png

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

GET haicodernet/_doc/2

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

06_Elasticsearch更新文档.png

我们看到,此时 index 字段的值和 name 字段的值都已经被更新了,而且这种方式使用起来更方便简单。

Elasticsearch更新文档总结

在 Elasticsearch 中,要更新一个文档,有两种方法,即,使用 PUT 方法直接覆盖原来的记录与使用 POST 修改文档的具体的字段信息。