Elasticsearch内联脚本:我们可以在" params"中使用ctx._source字段

时间:2017-11-24 05:38:28

标签: elasticsearch

我正在尝试使用以下update_by_query更新大量文档。 有效载荷是这样的:

考虑一个案例:

currentValues.status字段的值已从" New"更改为到"固定"
currentValues.priority字段的值从" High"到"低"

所以基本上是这样的 1]我想记录参数exa的旧值:" status"," priority"并将其分配给" oldValues"在他们更新之前。
2]更新后,我想将它们分配给" currentValues"

{
  "oldValues": {
    "status": "New",
    "priority": "High",
    .
    .
    .
    many other fields
  },"currentValues": {
    "status": "Fixed",
    "priority": "Low",
    .
    .
    .
    many other fields
  }
}

我试图通过以下脚本来实现。

POST http://localhost:9200/index/type/_update_by_query

{
  "script": {
    "inline": "ctx._source.data.oldValues.status=params.previousStatus;",
    "params": {
      "previousStatus": {"status": ctx._source.currentValues.status }, // **Unrecognized token 'ctx': was expecting ('true', 'false' or 'null')**
    }
   }
}

所以我试图将旧的状态值存储在某些常量中,即" previousStatus")" params"部分并在"脚本"中使用它节。
但看起来我们只能存储" params"节。
我们可以指定" ctx._source"的值字段到某个常数(exa:" previousStatus"  在上面的脚本中)" params"部分??
如果没有,有没有办法可以将旧值存储在某个变量中并使用它" script"。

提前致谢!

Sandeep

1 个答案:

答案 0 :(得分:2)

您可以使用以下脚本将以前的值存储在旧状态,并将当前状态值更新为新值。

{
  "script": {
    "inline": 
    "ctx._source.data.oldValues.status=ctx._source.data.currentValues.status;     
     ctx._source.data.oldValues.priority=ctx._source.data.currentValues.priority;
     ctx._source.data.currentValues.status=params.newState.status;
    ctx._source.data.currentValues.priority=params.newState.priority;",
    "params": {
      "newState": {"status": "Fixed","priority": "Low" }
    }
   }
}