Применение шаблона элемента к elasticsearch

Я пытаюсь применить шаблон элемента к моему кластеру elasticsearch, чтобы решить проблему наличия полей с содержимым более 32 КБ. Я использую версию 2.4.4, так как это самая высокая поддерживаемая версия в graylog.

См .: https://github.com/Graylog2/graylog2-server/issues/873

В частности, решение здесь : https://github.com/Graylog2/graylog2-server/issues/873#issuecomment-199898314

Я также столкнулся с другой проблемой, которую я пытаюсь исправить с помощью шаблона элемента. Одно из полей может содержать число или строку. Но поскольку elasticsearch отображает поле на основе первого появления в нем значения, он иногда выдает исключение MapperParsingException в активном индексе.

На основе решения, предложенного в связанной проблеме github, я создал свой собственный шаблон элемента и при поддержке документации elasticsearch я добавил динамический шаблон.

Вот результат:

{
    "template": "graylog*",
    "mappings": {
        "_default_": {
            "_all": {
                "enabled": false
            },
            "dynamic_templates": [{
                "entityid_as_string": {
                    "match": "EntityId",
                    "mapping": {
                        "type": "string"
                    }
                }
            },
            {
                "notanalyzed_string": {
                    "match_mapping_type": "string",
                    "mapping": {
                        "ignore_above": 32766,
                        "type": "string",
                        "doc_values": true
                    }
                }
            }]
        }
    }
}

Я ожидаю, что поле EntityId всегда будет отображаться как строка. И что любые строковые поля в документе с содержанием более 32 КБ не будут проиндексированы.

Но, похоже, это не так. Даже после ручного поворота активного индекса записи я все равно получаю те же ошибки. Я даже перезагрузил виртуальную машину и изменил индекс активной записи - безрезультатно.

Может ли кто-нибудь увидеть очевидную ошибку в моем шаблоне? В частности, я не уверен, должен ли там быть раздел _all.

Я использовал эту команду, чтобы добавить его:

curl -XPUT 'localhost:9200/_template/loggingtemplate?pretty' -H 'Content-Type: application/json' -d'<template here'

И эту команду, чтобы проверить, что он был добавлен.

curl -XGET localhost:9200/_template/loggingtemplate
0
задан 31 May 2017 в 14:57
1 ответ

По какой-то причине мое динамическое отображение не было учтено.

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

Подробности здесь: http://docs.graylog.org/en/2.2/pages/configuration/elasticsearch.html#custom-index-mappings

Это сопоставление, которое я создал для наших наборов индексов. В конкретном примере я применяю его к набору индексов под названием «application_logs».

{
    "template": "application_logs_*",
    "mappings": {
        "message": {
            "properties": {
                "Message": {
                    "type": "string",
                    "ignore_above": 32766
                },
                "EventEntities": {
                    "type": "string",
                    "ignore_above": 32766
                },
                "Severity": {
                    "type": "string"
                },
                "EntityId": {
                    "type": "string"
                }
            }
        }
    }
}

Чтобы добавить его в elasticsearch, я бы затем использовал следующую команду.

curl -XPUT 'localhost:9200/_template/logs_fields_as_strings?pretty' -H 'Content-Type: application/json' -d'{"template": "application_logs_*","mappings" : {"message" : {"properties" : {"Message" : {"type" : "string","ignore_above" : 32766},"EventEntities" : {"type" : "string","ignore_above": 32766},"Severity" : {"type" : "string"},"EntityId" : {"type" : "string"}}}}}'

Это создаст шаблон под названием «logs_fields_as_strings».

Для каждого имеющегося у нас набора индексов мне нужно будет изменить имя шаблона и цель шаблона.

Число 32766 - это максимальное количество байты, которые может содержать поле, если оно должно быть проиндексировано. Имейте в виду, что некоторые символы UTF8 имеют размер 3 байта. Поэтому, если вы ожидаете, что они будут в ваших сообщениях, вам нужно разделить 32766 на 3, чтобы убедиться, что вы не потеряете ни одного сообщения.

2
ответ дан 4 December 2019 в 13:32

Теги

Похожие вопросы