在我的项目中需要定期将es中的客户数据进行更新,部分数据是object类型也就是json类型,因为客户数据中不同的字段的数据类型是不一样的,而且不是每次都更新所有的字段,所以采用了es局部更新中的方法:doc方法,举例如下:
但是这种方式对于数据类型为object的字段没有作用,如果一个字段比如field1={"a":"1", "b": "2"},如果该字段新值为{"a": "1"},那么采用doc 的局部更新将没有任何效果,但是反过来,如果一开始是{"a": "1"},而用{"a":"1", "b": "2"}更新的话就行,从官网了解,大概说是对于object类型是非全部替换式的更新,而是内部根据实际键值进行更新,也就是按照里面的键值变化情况进行更新。
找了很多资料,最终找到了解决方法,那就是采用script脚本的方式进行处理,例如下:
POST test/type1/123/_update
{
"script": """
ctx._source.object_field= [ "field_key": "field_value" ]
"""
}
就是将object类型的“{}”换成“[]”,就可以成功修改字段值了,亲测有效!
更新:
刚才的方法需要将object类型的“{}”换成“[]”,需要编程进行转换,比较麻烦,所以我又多方查找和实验,发现通过以下方式也可以达到同样的效果:
POST test/type1/123/_update
{
"script": {"source": "ctx._source.field=params.field",
"params":{
"field": {
"field_key": "field_value"
}
}
}
}
这样就不需要转换,比较方便!
参考资料: