elasticsearch elasticsearch能否保证在高频率更新一个文档时的正确性?,elasticsearch,elastic4s,elasticsearch,Elastic4s" /> elasticsearch elasticsearch能否保证在高频率更新一个文档时的正确性?,elasticsearch,elastic4s,elasticsearch,Elastic4s" />

elasticsearch elasticsearch能否保证在高频率更新一个文档时的正确性?

elasticsearch elasticsearch能否保证在高频率更新一个文档时的正确性?,elasticsearch,elastic4s,elasticsearch,Elastic4s,我一直在从事一个项目,该项目涉及对elasticsearch的大量更新,我发现,当更新应用于单个文档时,频率很高,无法保证一致性 对于每个更新,我们都是这样做的(scala代码)。请注意,我们必须显式删除原始字段并用新字段替换它,因为我们不需要“merge”(\u update实际上在elasticsearch中是merge) 它不能。您可以将write quorum级别提高到all(有关此方面的一些讨论,请参阅;另请参阅文档),这将使您更加接近。但是Elasticsearch没有任何线性化保证

我一直在从事一个项目,该项目涉及对elasticsearch的大量更新,我发现,当更新应用于单个文档时,频率很高,无法保证一致性

对于每个更新,我们都是这样做的(scala代码)。请注意,我们必须显式删除原始字段并用新字段替换它,因为我们不需要“merge”(\u update实际上在elasticsearch中是merge)


它不能。您可以将write quorum级别提高到all(有关此方面的一些讨论,请参阅;另请参阅文档),这将使您更加接近。但是Elasticsearch没有任何线性化保证(例如示例和定义),并且不难编造出ES不一致的场景


也就是说,它在大多数情况下都是一致的。但是在高更新环境中,您将对JVM施加很大的GC压力,以清除旧文档。我假设您知道ES中的更新是如何工作的,但如果您不知道,也值得注意

您能解释一下一致性是什么意思吗。您是多次更新此文档还是不同的文档?多次更新一个文档我不相信有任何保证。
def replaceFields(alarmId: String, newFields: Map[String, Any]): Future[BulkResponse] = {
def removeField(fieldName: String): UpdateDefinition = {
  log.info("script: " + s"""ctx._source.remove("${fieldName}")""")
  update id alarmId in IndexType script s"""ctx._source.remove("${fieldName}")"""
}

client.execute {
  bulk(
    {newFields.toList.map(ele => removeField(ele._1)) :+
      {update id alarmId in IndexType doc (newFields)}} : _*
  )
}}