使用python附加到现有的elasticsearch数组字段



我有以下ES对象:

    {
      "_index": "index_name",
      "_type": "my_type",
      "_id": "12345678-abcd-9012-efgh-3456ijkl7890"
      "_source": {
        "apps": [
          {
            "processName": "process_name_1",
            "name": "app_name_1",
            "VersionName": "version_1"
          },
          {
            "processName": "process_name_2",
            "name": "app_name_2",
            "VersionName": "version_2"
          }
        ]
      }
    }

我想在保留现有数据的同时,将另一个对象添加到"应用程序"数组中,使其看起来如下:

    {
      "_index": "index_name",
      "_type": "my_type",
      "_id": "12345678-abcd-9012-efgh-3456ijkl7890"
      "_source": {
        "apps": [
          {
            "processName": "process_name_1",
            "name": "app_name_1",
            "VersionName": "version_1"
          },
          {
            "processName": "process_name_2",
            "name": "app_name_2",
            "VersionName": "version_2"
          },
          {
            "processName": "process_name_3",
            "name": "app_name_3",
            "VersionName": "version_3"
          }
        ]
      }
    }

正如你所看到的,我只向这些应用程序对象添加了第三个"应用程序"。我需要在Python中使用elasticsearch模块来完成这项工作。我的所有尝试要么覆盖现有项目,要么无效。我尝试使用"ctx._source.apps+=newapps"脚本,但使用Python,它似乎只是在"apps"对象旁边附加一个名为"scripts"的新对象和新数据,而不是仅添加到"apps)对象。有什么想法吗?

类似的东西应该可以工作,您可以参考python的更新api了解更多信息。您需要将script放入body参数中

from elasticsearch import Elasticsearch
es = Elasticsearch()
es.update(
    index="index_name",
    doc_type="my_type",
    id="12345678-abcd-9012-efgh-3456ijkl7890",
    body={"script": "ctx._source.apps += app",
          "params": {
              "app": {
                  "processName": "process_3",
                  "name": "name_3",
                  "VersionName": "version_3"
              }
            }
          }
)

最新更新