使用脚本部分更新文档并添加缺失的字段
Partially update a document using scripting and add missing fields
我想知道是否可以使用部分文档更新文档,并使用脚本执行另一个操作,例如,如果我添加数据 1,然后添加数据 2,我希望我的文档看起来像 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)
我想知道是否可以使用部分文档更新文档,并使用脚本执行另一个操作,例如,如果我添加数据 1,然后添加数据 2,我希望我的文档看起来像 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)