Открыть сервис

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.

ХарактеристикаKQLLuceneSQL (для 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 →