通过查询API在elasticsearch update中选择带有参数的文档字段

问题描述 投票:1回答:1

ElasticSearch版本= 5.5

我继承了一些代码,通过update by query API将任意文档字段更新为任意值,如下所示:

{
 "query": ...
 "script": {
   "inline": "ctx._source." + field + " = " + value + ";"
   }
 }

由于每分钟最大编译断路器,这偶尔会导致查询失败。

partial update适用于这种情况,但据我所知,部分更新仅在标准更新API中支持,而不是由查询API更新:

{
 "query": ...
 "doc": {
   field: value
   }
 }

Unknown key for a START_OBJECT in [doc]

至少,作为ES newb,我认为这就是错误的含义。在查询API文档的更新中也没有提到doc

假设我是正确的,部分更新不起作用,按照scripting guide中的建议参数化脚本似乎是下一步,但似乎没有任何方法可以访问参数指定的源字段:

# I wouldn't expect this to work, but tried anyway
{
 "query": ...
 "script": {
   "inline": "ctx._source.params.field = value;",
   "params": {
      "field": field,
      "value": value
      }
   }
 }

"caused_by":{"type":"null_pointer_exception","reason":null}}

试图通过doc-values访问该字段似乎也不起作用:

{
 "query": ...
 "script": {
   "inline": "doc[params.field] = value;",
   "params": {
      "field": field,
      "value": value
      }
   }
 }

caused_by":{"type":"null_pointer_exception","reason":null}}

有没有办法修复这个脚本或是否需要更广泛的重构?

elasticsearch field elasticsearch-5 elasticsearch-painless
1个回答
5
投票

你是对的,partial updates are not supported是由查询更新API(+ here)。

你几乎找到了正确的方法来做到这一点,就像这样:

{
 "query": ...
 "script": {
   "inline": "ctx._source[params.field] = params.value;",
   "params": {
      "field": field,
      "value": value
      }
   }
 }

更新:从ES 6开始,用inline替换source

© www.soinside.com 2019 - 2024. All rights reserved.