elasticsearch 局部更新中对象类型的bug

    在我的项目中需要定期将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"
    }
  }
}
}

这样就不需要转换,比较方便!

参考资料:

Updating an Object field

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值