长类型的弹性搜索无痛脚本问题

Elastic search painless script issue with long type

I am currently using Elastic search 5.2 and trying to perform upsert operation using the following rest api:

此 api 执行以下操作:

1.) 如果在弹性搜索中找不到索引,则使用更新插入字段内提供的 json 创建索引。
2.) 如果索引存在,则它通过 运行 文档中提供的无痛脚本执行部分更新。

问题:
我已经为计数器创建了弹性搜索索引映射。

此更新工作正常,直到计数器值在整数范围内。(即)2,147,483,647
超过这个值,它溢出并成为负值,如果期望值是正长值(因为相应的索引映射是长的)。有没有办法在使用无痛脚本时解决这个 int 溢出问题?

您只需要稍微修改一下脚本,而不是使用 += 运算符。如果您将脚本修改为 ctx._source.size = ctx._source.size + params.size 而不是 ctx._source.size += params.size,那么它将按您预期的那样工作:

POST indexname/typename/id/_update
{
  "script" : {
    "inline": "ctx._source.size = ctx._source.size + params.size",
    "lang": "painless",
    "params" :{
      "size" : 14889114000
    }
  },
  "upsert" : {
    "size" : 1488911400
  }
}

首先,文档将被更新为 size: 1488911400,然后在第二次更新时,它将包含值 size: 16378025400,即 1488911400 + 14889114000