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

elh*_*efe 1 field elasticsearch elasticsearch-5 elasticsearch-painless

ElasticSearch版本= 5.5

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

{
 "query": ...
 "script": {
   "inline": "ctx._source." + field + " = " + value + ";"
   }
 }
Run Code Online (Sandbox Code Playgroud)

由于每分钟断路器的最大编译次数,这有时会导致查询失败。

一个部分更新将为这种情况下工作良好,但据我可以判断,部分更新标准更新API,而不是查询API提供的更新只支持:

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

Unknown key for a START_OBJECT in [doc]
Run Code Online (Sandbox Code Playgroud)

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

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

# 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}}
Run Code Online (Sandbox Code Playgroud)

尝试通过doc值访问该字段似乎也不起作用:

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

caused_by":{"type":"null_pointer_exception","reason":null}}
Run Code Online (Sandbox Code Playgroud)

有什么办法可以修复此脚本,或者需要更广泛的重构?

Val*_*Val 8

没错,按查询更新API(此处 + )不支持部分更新

但是,您几乎找到了正确的方法,如下所示:

{
 "query": ...
 "script": {
   "inline": "ctx._source[params.field] = params.value;",
   "params": {
      "field": field,
      "value": value
      }
   }
 }
Run Code Online (Sandbox Code Playgroud)

更新: 从ES 6开始,替换inlinesource