长类型的弹性搜索无痛脚本问题
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:
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.) 如果在弹性搜索中找不到索引,则使用更新插入字段内提供的 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
I am currently using Elastic search 5.2 and trying to perform upsert operation using the following rest api:
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.) 如果在弹性搜索中找不到索引,则使用更新插入字段内提供的 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