弹性搜索可以保证在高频率更新一个文档时的纠正性吗?

时间:2015-06-19 12:47:22

标签: elasticsearch elastic4s

我一直致力于一个涉及对弹性搜索进行大量更新的项目,我发现当更新应用于一个单一的doc高频时,就无法保证一致性。

对于每次更新,我们这样做(scala代码)。请注意,我们必须显式删除原始字段并将其替换为新字段,因为'merge'不是我们想要的(_update实际上是在elasticsearch中合并)。

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)}} : _*
  )
}}

1 个答案:

答案 0 :(得分:0)

它不能。您可以将写入仲裁级别提高到所有级别(有关此问题的详细讨论,请参阅Undestanding the write_consistency and quorum rule of Elasticsearch;另请参阅文档https://www.elastic.co/guide/en/elasticsearch/reference/2.4/docs-index_.html#index-consistency),这样可以让您更接近。但是Elasticsearch没有任何线性化保证(例如,https://aphyr.com/posts/317-jepsen-elasticsearch用于示例,https://aphyr.com/posts/313-strong-consistency-models用于定义),并且烹饪ES不一致的场景并不困难。

话虽如此,大多数时候它往往是一致的。但是在高更新环境中,你会在你的JVM上施加很多GC压力来清除旧文档。我假设您知道ES中的更新是如何工作的,但是如果您不是,那么值得关注https://www.elastic.co/guide/en/elasticsearch/reference/current/_updating_documents.html