2017-10-17 6 views
0

私はES 2.4.1を使用しており、式でフィールドを計算するためにインラインスクリプトを使用する必要があります。フィールド「105」で0がある場合elasticsearchスクリプト分割ゼロエラーの処理方法は?

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"}}  ] 
     } 
     } 
    } 

、この実行は、私はこの部門にゼロエラーを処理するにはどうすればよい

{"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

あなたは自分でスクリプト式を書いているのですか?クラスタの整合性についてあまり気にしない限り、これは本当に良い考えではありません。 – Val

+0

@Valご意見ありがとうございます。実際には、管理者役割のユーザーが新しいフィールドを動的に追加し、新しいフィールドを既存のフィールドから計算できるという要件があります。 –

答えて

0

最後に回避策が見つかりました。 式の各フィールドに '* 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で取り扱い浮かぶように関連するかもしれないと思います。しかしまだ確認されていない。

関連する問題