Elasticsearch 中修改和更新的黑白区别是什么?

The*_*der 2 elasticsearch

我正在关注 Elasticsearch 官方文档,其中有一个关于修改文档的部分: https://www.elastic.co/guide/en/elasticsearch/reference/6.2/_modifying_your_data.html 所以我已经有一个文档/customer/_doc/1

{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 1,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "ajay"
  }
}
Run Code Online (Sandbox Code Playgroud)

下面是“修改”的请求

PUT /customer/_doc/1
{
  "firstname": "ajay",
  "lastname": "tanwar"

}
Run Code Online (Sandbox Code Playgroud)

GET将返回更新后的文档

{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 2,
  "_seq_no" : 2,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "firstname" : "ajay",
    "lastname" : "tanwar"
  }
}
Run Code Online (Sandbox Code Playgroud)

在文档的下一页上,更新文档 https://www.elastic.co/guide/en/elasticsearch/reference/6.2/_updating_documents.html 下面是用于“更新”的请求

POST /customer/_doc/1/_update
{
  "doc":{
      "firstname": "ajay",
      "lastname": "tanwar"
  }
}
Run Code Online (Sandbox Code Playgroud)

这也返回与“修改”相同的结果。

我在这两者中注意到了两个区别:

  1. “修改”请求会更新_version每个请求。而“更新”请求保持_version不变
  2. “修改”请求的响应包含"result" : "updated"而“更新”请求的响应包含"result" : "noop"

但我很少有疑问:首先,为什么“修改”会返回"result" : "updated"?文档本身说这是一个修改操作。为什么要“修改”回报"result" : "noop"?顺便说一句,什么是noop

如果我们从逻辑上来说,修改和更新是同一件事。这两个不同的 API 的目的是什么?

Syn*_*ync 5

修改文档时,您会删除旧文档并在其位置插入一个全新的文档。这与 HTTP 的方法类似PUT,因为它只是用 HTTP 正文中发送的内容替换旧文档。

当您更新文档时,您会对旧文档进行更改。在内部,ElasticSearch 还将删除旧文档并插入新的(更新的)文档。但是,此操作应被视为只是对旧文档进行了更改。这与 HTTP 的PATCH方法类似,它将保留旧文档并仅应用 HTTP 正文中发送的更改。

"result" : "updated"意味着对 ElasticSearch 数据库进行了更改,而"result" : "noop"(无操作)意味着什么都没有发生(可能是因为更新后的最终结果与更新前相同)。