我一直在从事一个涉及对 elasticsearch 进行大量更新的项目,我发现当以高频率更新应用于单个文档时,无法保证一致性。
对于每次更新,我们都是这样做的(scala 代码)。请注意,我们必须显式删除原始字段并将其替换为新字段,因为“合并”不是我们想要的(_update 实际上是弹性搜索中的合并)。
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)}} : _*
)
}}