【问题标题】:Elastic - prevent updating documents弹性 - 防止更新文档
【发布时间】:2020-10-17 09:00:49
【问题描述】:

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

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

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

弹性的 _version 字段可以帮助解决这个问题吗?

【问题讨论】:

    标签: elasticsearch versioning


    【解决方案1】:

    如果您将index API 与特定的id 一起使用,elasticsearch 将使用较新的文档更新该文档。但是,如果您使用 create API 和特定的 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": {
          
      }
    }
    '
    
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这有点误导 - 几乎所有大数据数据库/存储都具有底层不可变存储布局,但这并不意味着它们在外部是不可变的。
      • @shay__ 感谢您的反馈,已编辑答案以避免任何混淆。
      • @shay__ lmk 如果它看起来不错,如果它有帮助,请不要忘记投票:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      相关资源
      最近更新 更多