我一直致力于一个涉及对弹性搜索进行大量更新的项目,我发现当更新应用于一个单一的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)}} : _*
)
}}
答案 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