【问题标题】:What is difference b/w modifying and updating in the Elasticsearch?在 Elasticsearch 中修改和更新有什么区别?
【发布时间】:2019-07-21 20:01:24
【问题描述】:

我正在关注 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"
  }
}

下面是“修改”的请求

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

}

GET 将返回更新后的文档

{
  "_index" : "customer",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 2,
  "_seq_no" : 2,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "firstname" : "ajay",
    "lastname" : "tanwar"
  }
}

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

POST /customer/_doc/1/_update
{
  "doc":{
      "firstname": "ajay",
      "lastname": "tanwar"
  }
}

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

我注意到这两个方面的两个不同之处:

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

但我有几个疑问:首先,为什么“修改”返回"result" : "updated"? Docs 本身说这是一个修改操作。为什么“修改”返回"result" : "noop"noopBTW 是什么?

如果我们按照逻辑进行,修改和更新是一回事。这两个不同的 API 的用途是什么?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

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

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

    "result" : "updated" 表示对 ElasticSearch 数据库进行了更改,而 "result" : "noop"(无操作)表示没有发生任何事情(可能是因为更新后的最终结果与更新前相同)。

    【讨论】:

    • 那么,在这两个操作中,最终我们都在删除旧版本并创建一个新版本?
    • 在内部,确实是这样。我已经编辑了我的答案,试图澄清两者之间的语义差异。
    • 如果答案回答了您的问题,请接受它以便关闭问题。 :)
    猜你喜欢
    • 1970-01-01
    • 2015-03-03
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多