ElasticSearch Агрегация текста или целое число - PullRequest
0 голосов
/ 18 декабря 2018

У нас есть процесс, в котором наши веб-службы создают записи журнала в 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

Есть ли лучший способ справиться с этой ситуацией?Если нет, то есть ли более надежный способ написания целочисленных преобразований?

1 Ответ

0 голосов
/ 18 декабря 2018

... ES для изменения отображения индекса поля

ES никогда не изменит отображение поля после его создания.Это может произойти только в том случае, если первая отправленная вами запись содержит строковое значение вместо целочисленного значения.

Вы можете легко преодолеть это, создав шаблон индекса , прежде чем индексироватьПервая запись:

PUT _template/my-template
{
  "index_patterns": ["my-index*"],
  "mappings": {
    "_doc": {
      "properties": {
        "my_integer_field": {
          "type": "integer"           <---- this will always be honored
          "ignore_malformed": true    <---- ignore if the value really isn't an integer
        }
      }
    }
  }
}
...