2017-10-17 2 views
0

J'utilise ES 2.4.1 et j'ai besoin d'utiliser un script en ligne pour calculer le champ par expression, par ex.Comment gérer elasticsearch script division erreur zéro?

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

Quand il y a 0 dans le champ « 105 », cette exécution échouera à l'exception

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

Comment puis-je gérer cette division zéro erreur, je l'espère, il peut attraper l'exception et continuer Compute champ, ou définissez le nouveau champ à l'infini lorsque rencontrer zéro division.

En raison de l'expression est entrée par l'utilisateur, il n'est donc pas simple de vérifier toute la division étant zéro ou non.

Merci

+0

Voulez-vous dire que l'utilisateur écrit lui-même l'expression du script? Ce n'est vraiment pas une bonne idée, à moins que vous ne vous souciez pas beaucoup de l'intégrité de votre cluster. – Val

+0

@Val Merci pour votre commentaire. En fait, l'exigence est que l'utilisateur du rôle admin puisse ajouter un nouveau champ dynamiquement, et le nouveau champ pourrait être calculé à partir de champs existants. –

Répondre

0

Enfin, j'ai trouvé une solution de contournement. ajoute '* 1.0' à chaque champ d'expression, puis ne signale aucune erreur.

Comme

"script": { 
     "inline": "ctx._source.'503'= ctx._source.'101'*1.0/( 
ctx._source.'104'*1.0* ctx._source.'105'*1.0)", 
     "lang": "groovy" 
     } 

Je pense que cela peut flotter lié à la manipulation en ElasticSearch. Mais pas encore confirmé.