我正在使用ES 2.4.1并且需要使用内联脚本来逐个字段地计算字段,例如
POST http://192.168.100.223:9200/bttest/_update_by_query
{
"script": {
"inline": "ctx._source.'503'= ctx._source.'101'/(
ctx._source.'104'* ctx._source.'105')",
"lang": "groovy"
},
"query": {
"bool": {
"must": [
{"exists": {"field": "101"}} , {"exists": {"field": "104"}} , {"exists": {"field": "105"}} ]
}
}
}
当字段'105'中有0时,此执行将失败,异常
{"error":{"root_cause":[{"type":"script_exception","reason":"failed to run inline script [ctx._source.'503'= ctx._source.'101'/( ctx._source.'104'* ctx._source.'105')] using lang [groovy]"}],"type":"script_exception","reason":"failed to run inline script [ctx._source.'503'= ctx._source.'101'/( ctx._source.'104'* ctx._source.'105')] using lang [groovy]","caused_by":{"type":"arithmetic_exception","reason":"Division by zero"}},"status":500}
如何处理此除零误差,我希望它可以捕获异常并继续计算字段,或者在满足除零时将新字段设置为无穷大。
由于表达式是由用户输入的,因此检查所有除法是否为零并不简单。
由于
答案 0 :(得分:1)
最后我找到了解决方法。 添加' * 1.0'对于每个表达式字段,它不会报告错误。
像
"script": {
"inline": "ctx._source.'503'= ctx._source.'101'*1.0/(
ctx._source.'104'*1.0* ctx._source.'105'*1.0)",
"lang": "groovy"
}
我认为这可能与Elasticsearch中的浮点处理有关。但尚未确认。