弹性 - 防止更新文档

Elastic - prevent updating documents

我可以使文档不可变吗?当文档提交给相同的 id 时,它们不会被重写吗?

POST "localhost:9200/index001/_doc/1" // First time it is created
'
{
  "stuff": {
      
  }
}
'

POST "localhost:9200/index001/_doc/1"  // Fails
'
{
  "otherstuff": {
      
  }
}
'

elastic 的 _version 字段对此有帮助吗?

默认情况下,elasticsearch 文档是不可变的,因为它们存储在不可变的段中,对现有文档的任何更新都意味着(创建新文档并将旧文档标记为已删除)。 但这并不能使它们在外部不可变。

您可以在发送更新请求之前根据文档 ID 简单地使用 GET API,或者如果您想避免额外的 API 调用,请使用 optimistic locking doc of ES 并相应地实施以避免进一步更新您的文档。

如果您将 index API 与特定的 id 一起使用,elasticsearch 将使用较新的文档更新该文档。但是如果你使用 create APIwith specific id,你允许 elasticsearch 的“put-if-absent”行为。这意味着,通过使用 create,如果 id 的文档已经存在于 index 中,则文档索引操作将失败。 这就是如何在 elasticsearch lower 7:

中使用 create
POST index001/_doc/1?op_type=create
'
{
  "stuff": {
      
  }
}
'

这用于 elasticsearch 7:

POST index001/_create/1
'
{
  "stuff": {
      
  }
}
'