Изменение свойств поля

102
16

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

method:SET

Это работает так, как ожидалось. Но если я изменю его на

query:SET

то он не возвращает документы со словом "SET" в поле запроса. Является ли поле запроса индексированным по-разному? Как сделать поле поиска "query" доступным?

Обновить:

Это из-за параметра "ignore_above", который используется для всех строковых полей? Я проверил сопоставление с помощью этого API...

GET /packetbeat-2018.02.01/_mapping/mysql/

Как удалить это ограничение и сделать все будущие удары индексированием поля запроса?

Обновление 2:

Если я упомянул всю строку в поиске на основе поля "запрос", она работает так, как ожидалось...

query:"SELECT name, type, comment FROM mysql.proc WHERE name like 'residentDetails_get' and db <=> 'portal' ORDER BY name, type"

Это возвращает все 688 записей за последние 15 минут. Когда я ищу следующее, я ожидаю получить больше...

query:"SELECT"

Но я не получаю ни одной записи. Я предполагаю, что это связано с тем, что индекс документа индексируется. Я предпочел бы получить эквивалент SQL: запрос типа '% SELECT%'

спросил(а) 2018-02-06T16:55:00+03:00 2 года, 8 месяцев назад
1
Решение
58

Это правильное поведение, учитывая запрос и отображение поля. И это не о пределе 1024. Вы можете либо опустить _all query: part, чтобы Elasticsearch использовал поле _all (которое будет удалено в ближайшем будущем), но здесь это зависит от версии используемого вами стека.

Или, лучше и правильнее, настраивать поле запроса по-разному в шаблоне пакета (так, чтобы следующие индексы использовали новое сопоставление):

    "query": {
"type": "text",
"fields": {
"raw": {
"type": "keyword",
"ignore_above": 1024
}
}
}

Основная идея заключается в том, что ES не разбивает значения в поле запроса (так как это keyword), и вам нужен способ сделать это. Вы можете использовать подстановочные знаки, но ES им не нравятся (особенно главные подстановочные знаки), и при выполнении такого запроса может возникнуть проблема с производительностью. "Правильный" подход с точки зрения ES - это тот, который я уже упомянул: проанализировать поле, сохранить исходную версию (для сортировки и агрегации) и простую версию для поиска.

ответил(а) 2018-02-11T09:05:00+03:00 2 года, 8 месяцев назад
41

Поле запроса packagebeat объявляется как "ключевое слово". Поэтому вы можете выполнять поиск всего запроса. Например, для

query: "select * from mytable"

Но что, если нам нужно искать запрос: "mytable"? Вам нужно сделать поле запроса доступным, изменив файл fields.yml. Добавьте параметр type: text в поле запроса раздела MySQL файла fields.yml, найденного в файле /etc/packetbeat

Соответствующий раздел файла будет выглядеть следующим образом...

- name: query
type: text
description: >
The query in a human readable format. For HTTP, it will typically be
something like 'GET /users/_search?name=test'. For MySQL, it is
something like 'SELECT id from users where name=test'.

ответил(а) 2018-02-10T20:01:00+03:00 2 года, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема