如何处理elasticsearch脚本划分零错误?

时间:2017-10-17 02:56:37

标签: elasticsearch

我正在使用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}

如何处理此除零误差,我希望它可以捕获异常并继续计算字段,或者在满足除零时将新字段设置为无穷大。

由于表达式是由用户输入的,因此检查所有除法是否为零并不简单。

由于

1 个答案:

答案 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中的浮点处理有关。但尚未确认。