首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Elasticsearch和painless,如何插入映射数组?

使用Elasticsearch和painless,如何插入映射数组?
EN

Stack Overflow用户
提问于 2019-04-26 10:05:16
回答 1查看 4K关注 0票数 0

我有以下代码:

代码语言:javascript
复制
  "script": {
    "lang": "painless",
    "source": """
      ctx._source.maparray = [
    "first" : "Foo",
    "last" : "Bar"
]

这导致了

代码语言:javascript
复制
"maparray": {
  "last": "Bar",
  "first": "Foo"
},

但是我希望maparray是一个数组。因此,现在基于:

https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-operators-array.html

我试着:

代码语言:javascript
复制
 "script": {
    "lang": "painless",
    "source": """
      ctx._source.maparray = new map[]{[
    "first" : "Foo",
    "last" : "Bar"
]}
    """,
    "params": {
      "key": "numWords"
    }
  }

但我得到了:

代码语言:javascript
复制
{
  "error": {
    "root_cause": [
      {
        "type": "script_exception",
        "reason": "compile error",
        "script_stack": [
          "... x._source.maparray = new map[]{[\n    \"first\" : \"Fo ...",
          "                             ^---- HERE"
        ],
        "script": "      ctx._source.maparray = new map[]{[\n    \"first\" : \"Foo\",\n    \"last\" : \"Bar\"\n]}",
        "lang": "painless"
      }
    ],
    "type": "script_exception",
    "reason": "compile error",
    "script_stack": [
      "... x._source.maparray = new map[]{[\n    \"first\" : \"Fo ...",
      "                             ^---- HERE"
    ],
    "script": "      ctx._source.maparray = new map[]{[\n    \"first\" : \"Foo\",\n    \"last\" : \"Bar\"\n]}",
    "lang": "painless",
    "caused_by": {
      "type": "illegal_argument_exception",
      "reason": "invalid sequence of tokens near ['map'].",
      "caused_by": {
        "type": "no_viable_alt_exception",
        "reason": null
      }
    }
  },
  "status": 500
}

我的语法有什么问题?

EN

回答 1

Stack Overflow用户

发布于 2019-04-26 18:54:49

您正在寻找的实际上是一个map数组。下面是我是如何想出一个使用Ingest Pipeline的示例脚本的。

所需的带脚本的管道

代码语言:javascript
复制
PUT _ingest/pipeline/my-pipeline-id-01
{
  "description" : "describe pipeline",
  "processors" : [
    {
        "script" : {
          "lang" : "painless",
          "inline" : """
             ArrayList al = new ArrayList();
             Map map = new HashMap();
             map.put("first","Foo");
             map.put("last", "Bar");
             al.add(map);
             ctx.maparray = al;
            """
        }
      }
  ]
}

您可以使用Reindex API测试脚本的工作方式。

重新编制索引脚本

代码语言:javascript
复制
POST _reindex
{
  "source": {
    "index": "<source_index_name>"
  },
  "dest": {
    "index": "<dest_index_name>",
    "pipeline": "my-pipeline-id-01"
  }
}

请测试以上内容,验证结果,并让我知道它的进展。

希望这能有所帮助!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55859865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档