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
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
@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. –