Используя Elasticsearch и безболезненно, как мне вставить массив карт? - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть следующий код:

  "script": {
    "lang": "painless",
    "source": """
      ctx._source.maparray = [
    "first" : "Foo",
    "last" : "Bar"
]

, что приводит к

"maparray": {
  "last": "Bar",
  "first": "Foo"
},

Но я хочу, чтобы maparray был массивом. Так что теперь на основе:

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

Я пытаюсь:

 "script": {
    "lang": "painless",
    "source": """
      ctx._source.maparray = new map[]{[
    "first" : "Foo",
    "last" : "Bar"
]}
    """,
    "params": {
      "key": "numWords"
    }
  }

но я получаю:

{
  "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
}

В чем проблема с моим синтаксисом?

1 Ответ

0 голосов
/ 26 апреля 2019

На самом деле вы ищете массив карт.Ниже приведен пример сценария, в котором я использовал Ingest Pipeline .

Обязательный конвейер со скриптом

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 .

Reindex Script

POST _reindex
{
  "source": {
    "index": "<source_index_name>"
  },
  "dest": {
    "index": "<dest_index_name>",
    "pipeline": "my-pipeline-id-01"
  }
}

Пожалуйста, проверьте выше, проверьте результаты и дайте мне знать, как это происходит.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...