Kibana Query Language
Kibana Query Language (KQL) — это язык структурированных запросов, предназначенный для фильтрации и поиска данных в Elasticsearch через интерфейс Kibana. KQL является частью стека Elastic Stack (ELK) и используется для построения выборок по индексам, полям и значениям в режиме реального времени. Язык ориентирован на простоту синтаксиса и интуитивную работу с данными как для аналитиков, так и для разработчиков.
История
KQL был введён в составе Kibana версии 5.0 (выпущен в 2016 году) как замена более сложному Lucene-синтаксису, который использовался в предыдущих версиях. Разработчики Elastic (компания, базирующаяся в США) стремились упростить процесс фильтрации данных для пользователей, не обладающих глубокими знаниями регулярных выражений или синтаксиса Lucene. Основной целью было создание языка, близкого к естественному, с минимальным количеством специальных символов. KQL стал стандартным языком запросов в Kibana, начиная с версии 6.0, и остаётся таковым по сей день. В последующих версиях (7.x, 8.x) функциональность KQL расширялась, включая поддержку вложенных полей, агрегаций и более сложных логических операторов.
Синтаксис и основные конструкции
KQL использует простой текстовый синтаксис, основанный на паре «поле: значение». Запросы могут быть как свободными (поиск по всем полям), так и структурированными (поиск по конкретным полям).
Свободный поиск
Если не указать имя поля, KQL выполняет поиск по всем полям индекса, поддерживающим полнотекстовый поиск (текстовые поля). Пример:
`` error ``
Этот запрос найдёт все документы, содержащие слово «error» в любом текстовом поле.
Поиск по полям
Для поиска по конкретному полю используется конструкция поле: значение. Пример:
`` status: 200 ``
Этот запрос вернёт все документы, где поле status содержит значение 200.
Операторы сравнения
KQL поддерживает стандартные операторы сравнения для числовых и датовых полей:
:— равно (для строк — совпадение по токену)>— больше>=— больше или равно<— меньше<=— меньше или равно!=— не равно
Пример:
`` bytes > 1000 ``
Логические операторы
Для комбинирования условий используются операторы AND, OR и NOT (регистр не важен). По умолчанию между условиями подразумевается оператор AND, если не указано иное.
AND— оба условия должны быть истинныOR— хотя бы одно условие истинноNOT— отрицание условия
Пример:
`` status: 200 AND bytes > 500 ``
Группировка условий
Для группировки условий используются круглые скобки. Это позволяет задавать приоритет выполнения операторов.
Пример:
`` (status: 200 OR status: 404) AND bytes > 100 ``
Поиск по фразам и частичное совпадение
Для поиска точной фразы (последовательности слов) используются двойные кавычки:
`` message: "connection refused" ``
Для поиска по части слова (префиксный поиск) — звёздочка *:
`` host: web* ``
Звёздочка может быть только в конце значения (префиксный поиск). Постфиксный поиск (с * в начале) не поддерживается. Для поиска по любому вхождению подстроки используется оператор : с кавычками, но это зависит от настроек анализатора.
Поиск по вложенным полям
Для полей типа nested (вложенные объекты) используется синтаксис с точкой:
`` user.name: "john" ``
Поиск по отсутствию поля
Для поиска документов, у которых поле отсутствует (или имеет значение null), используется оператор NOT с именем поля:
`` NOT field_name: * ``
Классификация запросов
Запросы KQL можно классифицировать по нескольким признакам:
По типу полей
- Текстовые запросы — поиск по строковым полям (с учётом анализатора).
- Числовые запросы — сравнение чисел, дат, IP-адресов.
- Булевы запросы — поиск по полям типа
boolean(true/false). - Запросы по вложенным полям — работа с объектами типа
nestedиobject.
По сложности
- Простые запросы — одно условие (например,
status: 200). - Составные запросы — несколько условий с логическими операторами.
- Вложенные запросы — с группировкой и использованием скобок.
Применение
KQL используется в основном в двух контекстах:
Анализ логов и мониторинг
В Kibana KQL применяется для фильтрации данных на дашбордах, в визуализациях и в интерфейсе Discover. Аналитики и инженеры по эксплуатации используют KQL для быстрого поиска ошибок, аномалий или конкретных событий в логах серверов, приложений и сетевых устройств.
Безопасность и SIEM
В Elastic Security (модуль безопасности Elastic Stack) KQL используется для построения правил обнаружения угроз, корреляции событий и расследования инцидентов. Пример запроса для поиска подозрительной активности:
`` event.type: "alert" AND event.severity: "high" AND NOT source.ip: 10.0.0.0/8 ``
Разработка и отладка
Разработчики используют KQL для тестирования запросов к Elasticsearch в консоли Dev Tools Kibana, а также для настройки фильтров в пользовательских интерфейсах.
Сравнение с другими языками запросов
KQL часто сравнивают с Lucene-синтаксисом (также поддерживается в Kibana) и SQL.
| Характеристика | KQL | Lucene | SQL (для Elasticsearch) | ||
|---|---|---|---|---|---|
| Сложность | Низкая | Средняя | Высокая | ||
| Специальные символы | Минимум (кавычки, скобки, *) | Много (+, -, &&, | , ~, ^) | Стандартные (SELECT, WHERE) | |
| Поддержка регулярных выражений | Нет | Да | Да (через LIKE) | ||
| Поиск по фразам | Да (кавычки) | Да (кавычки) | Да (LIKE) | ||
| Агрегации | Нет | Нет | Да (GROUP BY) | ||
| Скорость выполнения | Высокая | Высокая | Средняя (зависит от сложности) |
KQL уступает SQL в возможностях агрегации и сложных преобразований, но превосходит его в простоте и скорости выполнения простых фильтров. По сравнению с Lucene, KQL менее гибок (нет регулярных выражений, нет операторов +/-), но значительно проще для изучения и использования в повседневной работе.
Ограничения
KQL имеет ряд ограничений, которые следует учитывать:
- Отсутствие регулярных выражений — невозможно выполнить сложный поиск по шаблону (например,
[0-9]{3}). - Префиксный поиск только со звёздочкой —
*может быть только в конце значения, что ограничивает поиск по середине слова. - Нет поддержки агрегаций — KQL не позволяет выполнять группировку, подсчёт сумм, средних значений и т.д. (для этого используется другой синтаксис в Kibana).
- Чувствительность к регистру — по умолчанию KQL не чувствителен к регистру, но это зависит от настроек анализатора в Elasticsearch.
- Зависимость от маппинга — поведение запроса зависит от типа поля (текстовое, ключевое, числовое) и настроек анализатора, что может приводить к неожиданным результатам.
Интересные факты
- KQL не следует путать с Kusto Query Language (KQL) от Microsoft, который используется в Azure Data Explorer и имеет другой синтаксис и назначение.
- В Kibana можно переключиться между KQL и Lucene-синтаксисом в настройках интерфейса Discover.
- KQL поддерживает автодополнение полей и значений, что ускоряет написание запросов.
- Язык не является полноценным языком программирования — он предназначен исключительно для фильтрации данных.
Источники
- Официальная документация Elastic: «Kibana Query Language» (Elasticsearch B.V.)
- «Elastic Stack 7.x» — руководство пользователя (Elastic)
- Статья «KQL vs Lucene: Which Query Language Should You Use?» (блог Elastic)
- «Kibana: The Definitive Guide» (O'Reilly Media, 2017)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →