使用脚本合并文档

时间:2018-09-17 19:17:28

标签: elasticsearch elastic-stack

我想控制使用/_update API时文档的合并方式。如果文档不存在,我想创建它(如果存在),我想在某些条件下合并它的一部分。

示例:

POST master_alias/test/123/_update
{
  "doc": {
    "id": 123,
    "name": "test case",
    "tests": [
        {
          "id": 1,
          "name": "Test A"
        },
        {
          "id": 2,
          "name": "Test B"
        }
    ]
  },
  "doc_as_upsert": true
}

上述调用将创建一个文档,如下所示:

{
  "_index": "222681839523561",
  "_type": "test",
  "_id": "123",
  "_version": 1,
  "found": true,
  "_source": {
    "id": 123,
    "name": "test case",
    "tests": [
      {
        "id": 1,
        "name": "Test A"
      },
      {
        "id": 2,
        "name": "Test B"
      }
    ]
  }
}

现在,我下次要运行类似的内容:

POST master_alias/test/123/_update
{
  "doc": {
    "id": 123,
    "name": "test case",
    "tests": [
      {
        "id": 3,
        "name": "Test C"
      }
    ]
  },
  "doc_as_upsert": true,
  "script": {
    "lang": "painless",
    "inline": """
      ctx._source.tests += doc['tests']
      ]
    """
  }
}

我想得出以下结果:

{
      "_index": "222681839523561",
      "_type": "test",
      "_id": "123",
      "_version": 2,
      "found": true,
      "_source": {
        "id": 123,
        "name": "test case",
        "tests": [
          {
            "id": 1,
            "name": "Test A"
          },
          {
            "id": 2,
            "name": "Test B"
          },
          {
            "id": 3,
            "name": "Test C"
          }
        ]
      }
    }

但是,我还想添加其他控件。我有可能和Kibana一起玩但没有成功。我只能发布scriptdoc,所以我不确定如何使用新值发布文档,以及如何传递脚本(如果存在的话)将文档与现有文档合并。

0 个答案:

没有答案