# Правильное использование script в aggs

**URL:** <https://discuss.elastic.co/t/script-aggs/37576>\
**Category:** Вопросы на русском языке\
**Created:** [December 18, 2015, 1:37pm UTC](https://discuss.elastic.co/t/script-aggs/37576 "2015-12-18T13:37:12Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![11116](https://avatars.discourse-cdn.com/v4/letter/1/6bbea6/32.png) [@11116](https://discuss.elastic.co/u/11116)\
**Post date:** [December 18, 2015, 1:37pm UTC](https://discuss.elastic.co/t/script-aggs/37576/1 "2015-12-18T13:37:13Z")

</div>

Добрый день!

Из индекса нужно выделить количество пользовательских сессий с различными ошибками. Для этого используется такого вида запрос:

```auto
 "aggs": {
            "ERBL": {
               "cardinality": {
                  "script": "if (doc['error.ERBL.code']){ doc['info.PID'].value }"
               }
            },
            "ERVS": {
               "cardinality": {
                  "script": "if (doc['error.ERVS.code']){ doc['info.PID'].value }"
               }
            },
            "ERVS_CH": {
               "cardinality": {
                  "script": "if (doc['error.ERVS_CH.code']){ doc['info.PID'].value }"
               }
            }
... и так далее для других ошибок
 "All": {
               "cardinality": {
                  "field": "info.PID"
        }
}

```

Все поля с ошибками имеют вид `error._имя_ошибки_.code`.  
info.PID это идентификатор пользователя.  
Маппинг для ошибок выглядит так:

```auto
                     "ERBL": {
                        "properties": {
                           "code": {
                              "type": "integer"
                           },
                           "msg": {
                              "type": "string",
                              "index": "not_analyzed",
                              "doc_values": false
                           }
                        }
                     }

```

В результате получаем общее количество сессий и количество сессий с различными типами ошибок, высчитывается процент ошибок и отправляется внешним скриптом в мониторинг.  
Обязательно ли расписывать каждую ошибку отдельно, как мы сейчас делаем, или это можно сделать проще? И можно ли как-то получить сразу % ошибочных сессий от общих, а не высчитывать их отдельно в отправляющем скрипте?  
Спасибо!

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [December 18, 2015, 7:01pm UTC](https://discuss.elastic.co/t/script-aggs/37576/2 "2015-12-18T19:01:01Z")

</div>

Есть несколько вопросов:  
Сколько разных ошибок может присутствовать в документе?  
Маппинг для всех ошибок одинаковый?  
Сколько разных типов ошибок вы ожидаете иметь в системе?

---

<div class="post-metadata">

**Author:** ![11116](https://avatars.discourse-cdn.com/v4/letter/1/6bbea6/32.png) [@11116](https://discuss.elastic.co/u/11116)\
**Post date:** [December 22, 2015, 7:38am UTC](https://discuss.elastic.co/t/script-aggs/37576/3 "2015-12-22T07:38:01Z")

</div>

В одном документе только одна ошибка  
У некоторых ошибок есть еще дополнительное поле для нумерации, но у всех есть поля для кода и текста ошибки  
Всего ошибок примерно 20

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [December 22, 2015, 4:51pm UTC](https://discuss.elastic.co/t/script-aggs/37576/4 "2015-12-22T16:51:15Z")

</div>

В этом случае, лучше "сплющить" структуру документа и хранить имя ошибки как обычное поле. В этом случае не нужно будет заморачиваться со скриптами, так как обычный (и гораздо более эффективный) агрегатор `terms` вполне справиться с такой структурой.

---

<div class="post-metadata">

**Author:** ![11116](https://avatars.discourse-cdn.com/v4/letter/1/6bbea6/32.png) [@11116](https://discuss.elastic.co/u/11116)\
**Post date:** [December 23, 2015, 7:45am UTC](https://discuss.elastic.co/t/script-aggs/37576/5 "2015-12-23T07:45:42Z")

</div>

Странно, что мы пропустили такое простое решение) Спасибо!

---

<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:50pm UTC](https://discuss.elastic.co/t/script-aggs/37576/6 "2017-07-06T13:50:11Z")

</div>

Closed on July 6, 2017, 1:50pm UTC


