0

在测试 Elasticsearch 索引中,我已经索引了一个文档,现在我想通过将其length属性设置为来更新文档100。我想通过elasticsearch包通过脚本来做到这一点(因为这是一个简化的例子来说明我的问题)。

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.

使用以下内容:

  • 弹性搜索服务器v6.1.1
  • Elasticsearch JavaScript 客户端v14.1.0

我该如何解决这个问题?

4

1 回答 1

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应该阅读:

客户端.更新({
  索引:'我的索引',
  类型:'我的类型',
  编号:'1',
  身体: {
    脚本: {
      lang: '无痛',
      来源: 'ctx._source.tags +=参数。标签',
      参数:{标签:'一些新标签'}
    }
  }
},函数(错误,响应){
  // ...
});


因此,如果您将脚本更改为:

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

它应该工作!


您可能需要参考Painless 示例 - 使用 Painless 更新字段页面!

于 2018-02-26T18:53:01.130 回答