У нас есть процесс, в котором наши веб-службы создают записи журнала в ElasticSearch (C #, используя NEST).Имена индексов ES включают месяц и год.
Программа агрегации (C #, не использующая NEST) извлекает информацию из различных журналов в реальном времени.Он состоит из гистограммы даты, некоторых терминов (host, ip и т. Д.) И суммирования некоторых целочисленных полей.Это делает запрос, подобный следующему:
{
"size":0,
"query": {
"range":{"date":{"gt":"2018-10-01T00:00:00","lte":"2018-10-01T01:00:00"}}
},
"aggs": {
"myBuckets": {
"composite": {
"size":100,
"sources": [
{"host":{"terms":{"field":"host.keyword","missing":""}}},
{"ipAddress":{"terms":{"field":"ipAddress.keyword","missing":""}}},
{"date":{"date_histogram":{"field":"date","interval":"1h"}}}
]
},
"aggregations": {
"records":{"sum":{"field":"records","missing":0}}
}
}
}
}
Проблема заключается в этих целочисленных полях, в которых иногда веб-сервис-мошенник / глючит будет использовать строку вместо целого числа.Это приводит к тому, что ES меняет отображение индекса поля (с целого на строку) и нарушает агрегатор.
Исправление индекса с помощью переиндексации не является вариантом, мы бы предпочли обрабатывать это на-прилет, если это возможно.
Мой текущий план состоит в том, чтобы прочитать карту индекса и переключить агрегацию суммирования на безболезненный скрипт, подобный следующему:
doc['badField.keyword'].value!=null ? Integer.parseInt(doc['badField.keyword'].value) : 0
Есть ли лучший способ справиться с этой ситуацией?Если нет, то есть ли более надежный способ написания целочисленных преобразований?