1

我目前正在使用 Elastic search 5.2 并尝试 使用以下 rest api执行upsert操作:

  • http://ip:9200/indexname/typename/id/_update

    json有效负载:

    {
    "script" : {
        "inline": "ctx._source.size +=params.size",
        "lang": "painless",
        "params" :{
        "size" : 14889114000
        }
    },
    "upsert" : {
        "size" : 1488911400
    }
    

    }

这个 api 做了以下事情:

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

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

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

4

1 回答 1

1

您只需要稍微修改您的脚本而不使用+=操作符。如果您将脚本修改为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: 163780254001488911400 + 14889114000

于 2017-05-02T07:39:09.200 回答