Перейти к основному содержимому

seq-ql

Полнотекстовый поиск

Полнотекстовый поиск в seq-ql позволяет фильтровать результат по токенам документов. Запросы могут содержать точные фразы или ключевые слова, разделенные пробелами. Это поведение зависит от типа индекса, подробнее о формировании токенов см. виды индексов. При выполнении полнотекстового поиска система автоматически отбирает результаты, соответствующие заданному тексту.

По умолчанию поиск не чувствителен к регистру. Это конфигурируется с помощью параметра --case-sensitive и влияет только на новые документы.

Строковые литералы

В seq-ql можно использовать разные синтаксисы для строковых литералов при указании значений в фильтрах.

  1. Без кавычек — можно использовать, если поле или значение состоят из одного слова без пробелов и специальных символов:

    key: value
  2. Одинарные кавычки (') — позволяют указывать поля или значения, содержащие пробелы и специальные символы:

    ключ: 'значение с пробелами'

    Внутри кавычек может быть escape-последовательность, которая всегда должна начинаться с символа \, пример:

    # Эквивалентно поиску: ключ:значение
    ключ: '\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435'

    Поддерживаемые escape-последовательности:

    • Подстановочные символы – \*
    • Кавычки и слэши – \", \', \\
    • Unicode – \u для 4-байтовых символов, \U для 8-байтовых символов
    • Управляющие символы – \n, \r
    • Байт – \x
  3. Двойные кавычки (") — аналогично одинарным кавычкам, но позволяют использовать одинарные кавычки внутри строки:

    "ключ": "значение с 'кавычками'"
  4. Обратные кавычки (`) — используются для полей и значений, содержащих как одинарные, так и двойные кавычки:

    `ключ с пробелом`:`значение с "двойными" и 'одинарными' кавычками`

    Важно: обратные кавычки не экранирует подстановочные и escape-последовательности, поэтому следующие примеры эквивалентны:

    ключ: `\n` or ключ: `*`
    ключ: '\\n' or ключ: '\*'

Логические операторы

seq-ql поддерживает логические операторы для более точного фильтра поиска. Операторы and, or, not позволяют комбинировать и усложнять запросы:

  • and — используется для поиска, где оба условия должны быть истинными.
  • or — возвращает результаты, если одно из условий выполняется.
  • not — исключает результаты, соответствующие указанному условию.

Примеры:

message:error and level:critical
message:login or message:logout
not level:debug

Подстановочные символы

Wildcards, или "подстановочные символы", в seq-ql позволяют производить поиск по частичному совпадению. Язык поддерживает следующие символы:

  • * — заменяет любое количество символов.

Эти символы можно использовать для поиска на уровне отдельного токена или его части. Например, запрос keyword индекса source_type:access* найдет все документы, начинающиеся с access.

Фильтр range

seq-ql позволяет использовать диапазоны значений (range) для фильтрации данных. Это особенно полезно для числовых значений, таких как размеры или время. Диапазоны задаются с использованием квадратных или круглых скобок:

  • [a, b] — включает границы диапазона.
  • (a, b) — исключает границы диапазона.

Пример использования диапазона:

bytes:(100, 1000]
bytes:[100, 1000)

Фильтр in

seq-ql позволяет использовать фильтр in для фильтрации списка токенов. Синтаксис полнотекстового поиска такой же как и в полнотекстовом поиске с поддержкой всех видов строковых литералов, поисковые токены должны быть разделены запятой.

Пример использования in:

level:error and k8s_namespace:in(default, kube-system) and k8s_pod:in(kube-proxy-*, kube-apiserver-*, kube-scheduler-*)

trace_id:in(123e4567-e89b-12d3-a456-426655440000, '123e4567-e89b-12d3-a456-426655440001', "123e4567-e89b-12d3-a456-426655440002",`123e4567-e89b-12d3-a456-426655440003`)

Pipes

Pipes в seq-ql — это механизм для последовательной обработки данных. Pipes позволяют трансформировать, обогащать, фильтровать, агрегировать данные и форматировать результаты.

fields pipe

Pipe fields позволяет удалить лишние поля у документов в выдаче. Это может пригодиться, когда нужно оставить только нужные поля, также это особенно полезно при экспорте большого числа данных, чтобы сократить нагрузку на передачу по сети.

Перечисленные поля могут не входить в mapping и их наличие не влияет на производительность fields pipe.

Пример:

source_type:access* | fields user, KB

В итоговом результате у каждого документа будут только поля user и KB.

Чтобы удалить только перечисленные поля, воспользуйтесь ключевым словом except, пример:

source_type:access* | fields except payload, cookies

В этом примере поля payload, cookies будут исключены из результата.

Комментарии

Комментарии – текст, предоставленный пользователем, который будет проигнорирован при выполнении запроса. Комментарии должны начинаться с ключевого слова #, за которым следует текст комментария, который должен заканчиваться символом перевода на новую строку.

Пример:

# Экспорт дебаг логов file.d
service: file-d and message: 'Event sample' and level: error # Фильтруем логов file.d по уровню "error"
| fields event # Возвращаем поле 'event', чтобы получить все дебаг логи file.d

Рекомендации по оптимизации запросов в seq-ql

Оптимизация запросов в seq-ql позволяет эффективно обрабатывать большие объемы данных и получать нужные результаты быстрее, снижая нагрузку на систему.

Ниже перечислены ключевые рекомендации для оптимизации запросов seq-ql:

Сокращение возвращаемых полей

Указывайте только те поля, которые вам нужны, чтобы уменьшить объем данных и ускорить обработку запроса. Используйте форматирующий пайп fields, чтобы выбрать только важные поля:

source_type:access* |  fields KB, status, timestamp

Здесь итоговый результат включает только указанные поля KB, status и timestamp, что уменьшает время отправки результата.