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

Abh*_*ora 3 elasticsearch elasticsearch-aggregation elasticsearch-painless

我想编写一个应该返回字典的无痛脚本。基本上,如果我将它与 java 相关联,我想要 Dictionary< String, List > 的输出。

所以,我需要轻松声明一个 Map 和 List。另外,我需要向其中添加数据(如map.add())

我可以举例说明如何声明地图并向其添加数据吗?

[painless] ( https://www.elastic.co/guide/en/elasticsearch/painless/6.7/painless-examples.html )中的示例并未涵盖这一点。

我用的是v6.7

Val*_*Val 7

你可以简单地这样做:

使用空字典创建文档

PUT index/1
{
  "dict": {}
}
Run Code Online (Sandbox Code Playgroud)

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

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

您还可以使用脚本从头开始索引文档(使用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" : {}
}
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,您最终都会得到如下文档:

获取/索引/1

{
  "dict": {
      "key1" : ["val1", "val2", "val3"],
      "key2" : ["val1", "val2", "val3"]
  }
}
Run Code Online (Sandbox Code Playgroud)