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

Добрый день!

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

 "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 это идентификатор пользователя.
Маппинг для ошибок выглядит так:

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

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

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

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

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

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