【问题标题】:Select document field with parameter in elasticsearch update by query API通过查询API在elasticsearch更新中选择带有参数的文档字段
【发布时间】:2018-01-25 06:55:00
【问题描述】:

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 新手,我认为这就是错误的含义。在查询 API 文档的更新中也没有提到 doc

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

# 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】:

    你是对的,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

    【讨论】:

    • 天哪,我找这个例子已经 5 个小时了。感谢您提供第一个工作示例!
    • @KalleH.Väravas 很高兴它有帮助 ;-)
    猜你喜欢
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2023-03-04
    • 2020-02-26
    • 1970-01-01
    相关资源
    最近更新 更多