# Additionner dans un script

**URL:** https://discuss.elastic.co/t/additionner-dans-un-script/44001
**Category:** Discussions en français
**Created:** [March 10, 2016, 10:02am UTC](https://discuss.elastic.co/t/additionner-dans-un-script/44001 "2016-03-10T10:02:16Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![ChristopheBoucaut](https://avatars.discourse-cdn.com/v4/letter/c/54ee81/32.png) [@ChristopheBoucaut](https://discuss.elastic.co/u/ChristopheBoucaut)
#### Post date: [March 10, 2016, 10:02am UTC](https://discuss.elastic.co/t/additionner-dans-un-script/44001/1 "2016-03-10T10:02:16Z")

</div>

Bonjour,

Je suis en train de me casser les dents pour écrire un script dans le but de réaliser un sort. J'ai deux champs dans mon document. Si le premier est vide, je prends simplement la valeur du second. Par contre, si le premier existe et est rempli, je souhaite parcourir le tableau d'objets et additionner les différentes valeurs d'une propriété de chaque objets.

Mon problème : Malgré le fait que dans mon mapping, le champs soit renseigné comme "integer", java me ressort un problème de cast d'une String vers un Number (d'après le message d'erreur récupéré).

Mon mapping :

```auto
[...]
"element_nb": {
    "properties": {
         "element_name": { "type": "string", "index": "no" },
         "nb": { "type": "integer"}
     }
}
"nb_documents": { "type": "integer"},
[...]

```

Ma query :

```auto
{
  "sort": [
    {
      "_script": {
        "order": "desc",
        "type": "number",
        "script": "
            score_count = 0;
            if (_source.element_nb != null && _source.element_nb.size() > 0) {
                for (item in _source.element_nb) {
                    if (item.nb != null) {
                        score_count += item.nb;
                    }
                }
            } else {
                score_count = doc.nb_documents.value;
            };
            score_count;
            "
      }
    }
  ]
}

```

J'utilise _\_source_ car de toute évidence, vu que mon champs _element\_name_ n'est pas indexé, le champs parent _element\_name_ n'est pas dans _doc_. J'ai mis le script en forme pour être plus lisible, mais je l'envoie bien en inline.

L'erreur récupérée :

```auto
Query Failed [Failed to execute main query]]; nested:
GroovyScriptExecutionException[MissingMethodException[
    No signature of method: java.lang.Integer.plus() is applicable for argument types: ([C) values: [17]
    Possible solutions: plus(java.lang.Character), plus(java.lang.String), plus(java.lang.Number), abs(), split(groovy.lang.Closure), is(java.lang.Object)]];}]

```

Donc par exemple pour un document du type :

```auto
{
    nb_documents: 5
}

```

La valeur du sort sera simplement 5.

Dans le cas d'un document du type :

```auto
{
    element_nb: [
        {element_name: 'une_valeur', nb: 100},
        {element_name: 'une_valeur', nb: 200}
    ],
    nb_documents: 5
}

```

La valeur du sort devrait être 300 (100 + 200).

Je suis en ES 1.7.

Merci par avance si vous pouvez m'aiguiller sur une solution 🙂

---

<div class="post-metadata">

### Author: ![ChristopheBoucaut](https://avatars.discourse-cdn.com/v4/letter/c/54ee81/32.png) [@ChristopheBoucaut](https://discuss.elastic.co/u/ChristopheBoucaut)
#### Post date: [March 10, 2016, 10:33am UTC](https://discuss.elastic.co/t/additionner-dans-un-script/44001/2 "2016-03-10T10:33:48Z")

</div>

J'ai identifié mon soucis. J'appelle _\_source_. En regardant ce que j'envoie réellement, j'ai remarqué que j'envoie

```auto
{
    "element_nb": [
        {"element_name": "une_valeur", "nb": "100"},
        {"element_name": "une_valeur", "nb": "200"}
    ],
   "nb_documents": 5
}

```

Donc forcément, ma valeur est une string. Du coup, si je passe par _doc.element\_nb.nb_ mon problème devrait être réglé. Cependant, ES ne connait jamais mon champ _element\_nb_ dans _doc_. J'ai modifié le mapping pour indexer tous les champs enfants, mais rien n'y fait. J'ai essayé sur d'autres champs qui contiennent eux même des tableaux d'objets et j'ai le même soucis, ils sont inaccessibles depuis le _doc_.

Je vais chercher comment les rendre accessible depuis le _doc_. Si vous avez des pistes, j'accepte volontiers 😉

---

<div class="post-metadata">

### Author: ![ChristopheBoucaut](https://avatars.discourse-cdn.com/v4/letter/c/54ee81/32.png) [@ChristopheBoucaut](https://discuss.elastic.co/u/ChristopheBoucaut)
#### Post date: [March 10, 2016, 10:45am UTC](https://discuss.elastic.co/t/additionner-dans-un-script/44001/3 "2016-03-10T10:45:21Z")

</div>

Encore moi.... j'ai finalement trouvé.

Il suffit de faire _doc['element\_nb.nb']_. Merci à sense pour l'auto-complete qui sauve !

EDIT : Il reste tout de même un problème ... Boucler dessus fonctionne mais il y a un distinct réalisé. Du coup, si j'ai deux objets avec la même valeur pour _nb_, il n'additionnera pas ... Je ne suis même pas sur que l'on puisse itérer sur un objet du _doc_ sans qu'il réalise un distinct dessus ☹

---

<div class="post-metadata">

### Author: ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)
#### Post date: [July 6, 2017, 1:49pm UTC](https://discuss.elastic.co/t/additionner-dans-un-script/44001/4 "2017-07-06T13:49:09Z")

</div>


