使用脚本部分更新文档并添加缺失的字段

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)