如何在无痛弹性搜索中创建字典对象并向其中添加数据

时间:2019-05-15 07:52:33

标签: elasticsearch elasticsearch-aggregation elasticsearch-painless

我想编写一个轻松的脚本,该脚本应该返回字典。 基本上,如果我将其与Java相关联,则需要输出Dictionary

因此,我需要毫不费力地声明Map和List。 另外,我需要向其中添加数据(例如map.add())

请举个例子,您将如何声明地图并向其中添加数据?

[无痛](https://www.elastic.co/guide/en/elasticsearch/painless/6.7/painless-examples.html)上的示例未涵盖此内容。

我正在使用v6.7

1 个答案:

答案 0 :(得分:0)

您可以像这样简单地做到这一点:

使用空字典创建文档

PUT index/1
{
  "dict": {}
}

更新文档以将字典填充到参数中

POST index/_update/1
{
    "script" : {
        "source": "ctx._source.dict.putAll(params)",
        "lang": "painless",
        "params" : {
            "key1": ["val1", "val2", "val3"],
            "key2": ["val4", "val5"]
        }
    }
}

您还可以使用脚本(使用scripted_upsert)从头开始为文档编制索引

POST index/_update/1
{
    "scripted_upsert":true,
    "script" : {
        "source": """
          ctx._source.dict = [:];
          ctx._source.dict['key1'] = params.key1;
          ctx._source.dict['key2'] = params.key2;
        """,
        "params" : {
            "key1" : ["val1", "val2", "val3"],
            "key2" : ["val1", "val2", "val3"]
        }
    },
    "upsert" : {}
}

在两种情况下,您最终都会得到一个像这样的文档:

获取/ index / 1

{
  "dict": {
      "key1" : ["val1", "val2", "val3"],
      "key2" : ["val1", "val2", "val3"]
  }
}