В тестовом индексе Elasticsearch я проиндексировал документ и теперь хочу обновить документ, установив для его свойства length значение 100. Я хочу сделать это с помощью сценария (так как это упрощенный пример для иллюстрации моей проблемы) через {{X2 }} пакет.

client.update({
  index: 'test',
  type: 'object',
  id: '1',
  body: {
    script: 'ctx._source.length = length',
    params: { length: 100 }
  }
})

Однако я получаю следующую ошибку:

{
  "error": {
    "root_cause": [
      {
        "type": "remote_transport_exception",
        "reason": "[6pAE96Q][127.0.0.1:9300][indices:data/write/update[s]]"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "failed to execute script",
    "caused_by": {
      "type": "script_exception",
      "reason": "compile error",
      "script_stack": [
        "ctx._source.length = length",
        "                     ^---- HERE"
      ],
      "script": "ctx._source.length = length",
      "lang": "painless",
      "caused_by": {
        "type": "illegal_argument_exception",
        "reason": "Variable [length]is not defined."
      }
    }
  },
  "status": 400
}

Это происходит, даже если я включил свойство length в body.params.length.

Используя следующее:

  • Сервер Elasticsearch v6.1.1
  • Клиент JavaScript Elasticsearch v14.1.0

Как я могу решить эту проблему?

0
dayuloli 26 Фев 2018 в 21:27

1 ответ

Лучший ответ

Неправильная документация по адресу https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/api-reference.html#api-update.

В своем примере они положили:

client.update({
  index: 'myindex',
  type: 'mytype',
  id: '1',
  body: {
    script: 'ctx._source.tags += tag',
    params: { tag: 'some new tag' }
  }
}, function (error, response) {
  // ...
});

На самом деле body.script следует читать:

client.update({
  index: 'myindex',
  type: 'mytype',
  id: '1',
  body: {
    script: {
      lang: 'painless',
      source: 'ctx._source.tags += params.tag',
      params: { tag: 'some new tag' }
    }
  }
}, function (error, response) {
  // ...
});


Следовательно, если вы измените свой сценарий на:

script: {
  lang: 'painless',
  source: 'ctx._source.length = params.length',
  params: { length: 100 }
}

Он должен работать!


Вы можете сослаться на Безболезненные примеры - обновление Поля со страницей Безболезненно!

1
d4nyll 27 Фев 2018 в 01:38