使用脚本对文档进行部分更新,并添加缺失的字段。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用脚本对文档进行部分更新,并添加缺失的字段。相关的知识,希望对你有一定的参考价值。
我想知道是否可以使用部分文档更新文档,并使用脚本执行另一个操作,例如,如果我添加data1,然后添加data2,我希望我的文档看起来像final_result。我希望所有的东西都被替换和添加,除了标签字段。
data1 = "name" : "myname", "code" : 123, "tag" : "first"
data2 = "name" : "myname", "code" : 555, "tag" : "second", "age":"50", "children": "3"
final_result = "name" : "myname", "code" : 555, "tag" : ["first","second"], "age":"50", "children": "3"
我可以使用这个脚本添加标签字段,但我不知道如何同时添加缺失的字段,我也不知道哪些字段可能会被高级添加。
POST myindex/_update/1
"script" :
"source": "if(! ctx._source.tag.contains(params.tag))if (ctx._source.tag instanceof List) ctx._source.tag.add(params.tag) else ctx._source.tag = [ctx._source.tag, params.tag] ",
"lang": "painless",
"params" :
"tag" : "sec"
我真的很感激,如果有人能给我一个例子,如何在python中做到这一点。
答案
你只需要为字段设置新的值就可以了。
POST myindex/_update/1
"script":
"source": """
if(!ctx._source.tag.contains(params.tag))
if (ctx._source.tag instanceof List)
ctx._source.tag.add(params.tag)
else
ctx._source.tag = [ctx._source.tag, params.tag]
ctx._source.code = params.code
""",
"lang": "painless",
"params":
"tag": "sec",
"code": "555"
在Python上也是这样,创建Elasticsearch实例并调用update_by_query API
es = Elasticsearch(['https://user:secret@localhost:443'])
或者...
es = Elasticsearch(
['localhost', 'otherhost'],
http_auth=('user', 'secret'),
scheme="https",
port=443,
)
然后... 主体就是你的剧本
self.es.update_by_query(index = indexName, body = q)
以上是关于使用脚本对文档进行部分更新,并添加缺失的字段。的主要内容,如果未能解决你的问题,请参考以下文章
rethinkdb - hasFields 查找具有多个多个缺失条件的所有文档
python使用箱图法和业务规则进行异常数据处理并检查预测使用的数据特征是否有字段缺失的情况并补齐