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

Поиск в ClickStack и Elastic

ClickHouse — это движок с нативной поддержкой SQL, изначально созданный для высокопроизводительных аналитических рабочих нагрузок. Elasticsearch, напротив, предоставляет SQL-подобный интерфейс, транслируя SQL в базовый DSL запросов Elasticsearch, — то есть SQL в нем не является средством первого класса, а функциональный паритет ограничен. ClickHouse не только поддерживает полноценный SQL, но и расширяет его набором функций, ориентированных на обсервабилити, таких как argMax, histogram и quantileTiming, которые упрощают выполнение запросов к структурированным журналам, метрикам и трассировкам. Для простого анализа журналов и трассировок интерфейс ClickStack (HyperDX) предоставляет синтаксис в стиле Lucene для интуитивной текстовой фильтрации по запросам вида поле-значение, диапазонам, подстановочным шаблонам и другим конструкциям. Это сопоставимо с синтаксисом Lucene в Elasticsearch и элементами Kibana Query Language. Интерфейс поиска поддерживает этот знакомый синтаксис, но за кулисами преобразует его в эффективные SQL-условия WHERE, что делает работу привычной для пользователей Kibana и при этом позволяет при необходимости использовать всю мощь SQL. Это позволяет задействовать весь набор функций поиска по строкам, функций сходства и функций даты и времени в ClickHouse. Ниже мы сравним языки запросов Lucene в ClickStack и Elasticsearch.

Поисковый синтаксис ClickStack и строка запроса Elasticsearch

И ClickStack, и Elasticsearch предоставляют гибкие языки запросов для удобной фильтрации журналов и трассировок. Если строка запроса Elasticsearch тесно связана с его DSL и движком индексирования, то ClickStack поддерживает синтаксис в стиле Lucene, который под капотом переводится в ClickHouse SQL. В таблице ниже показано, как распространённые шаблоны поиска работают в обеих системах, с акцентом на сходство синтаксиса и различия в их внутреннем выполнении.
ВозможностьСинтаксис ClickStackСинтаксис ElasticsearchПримечания
Поиск по свободному текстуerrorerrorВыполняет поиск по всем индексируемым полям; в ClickStack это преобразуется в многостолбцовый SQL ILIKE.
Совпадение по полюlevel:errorlevel:errorСинтаксис идентичен. В ClickStack выполняется поиск точных значений полей в ClickHouse.
Поиск по фразе"disk full""disk full"Текст в кавычках соответствует точной последовательности; ClickHouse использует сравнение строк или ILIKE.
Совпадение фразы по полюmessage:"disk full"message:"disk full"Преобразуется в SQL ILIKE или точное совпадение.
Условия ORerror OR warningerror OR warningЛогическое OR для терминов; обе системы поддерживают это нативно.
Условия ANDerror AND dberror AND dbВ обеих системах соответствует пересечению; для пользователя синтаксис не отличается.
ОтрицаниеNOT error or -errorNOT error or -errorПоддерживается одинаково; ClickStack преобразует это в SQL NOT ILIKE.
Группировка(error OR fail) AND db(error OR fail) AND dbСтандартная булева группировка в обеих системах.
Подстановочные шаблоныerror* or *fail*error*, *fail*ClickStack поддерживает подстановочные шаблоны в начале и конце строки; в ES шаблоны в начале строки по умолчанию отключены из-за производительности. Подстановочные шаблоны внутри терминов не поддерживаются, например f*ail. Подстановочные шаблоны должны использоваться с совпадением по полю.
Диапазоны (числовые/дата)duration:[100 TO 200]duration:[100 TO 200]ClickStack использует SQL BETWEEN; Elasticsearch разворачивает это в range-запросы. Неограниченный * в диапазонах не поддерживается, например duration:[100 TO *]. При необходимости используйте Unbounded ranges ниже.
Неограниченные диапазоны (числовые/дата)duration:>10 or duration:>=10duration:>10 or duration:>=10ClickStack использует стандартные SQL-операторы
Включающие/исключающие границыduration:{100 TO 200} (исключая границы)То же самое{} обозначает исключающие границы. * в диапазонах не поддерживается. Например, duration:[100 TO *]
Проверка существованияN/A_exists_:user or field:*_exists_ не поддерживается. Используйте LogAttributes.log.file.path: * для столбцов Map, например LogAttributes. Для корневых столбцов они должны существовать и будут иметь значение по умолчанию, если не включены в событие. Чтобы искать значения по умолчанию или отсутствующие столбцы, используйте тот же синтаксис, что и в Elasticsearch: ServiceName:* or ServiceName != ''.
Regexфункция matchname:/joh?n(ath[oa]n)/В настоящее время не поддерживается в синтаксисе Lucene. Можно использовать SQL и функцию match или другие функции поиска по строкам.
Нечеткое совпадениеeditDistance('quikc', field) = 1quikc~В настоящее время не поддерживается в синтаксисе Lucene. В SQL можно использовать Функции расстояния, например editDistance('rror', SeverityText) = 1, или другие функции сходства.
Поиск по близостиНе поддерживается"fox quick"~5В настоящее время не поддерживается в синтаксисе Lucene.
Повышение весаquick^2 foxquick^2 foxВ настоящее время не поддерживается в ClickStack.
Подстановочный шаблон поляservice.*:errorservice.*:errorВ настоящее время не поддерживается в ClickStack.
Экранированные специальные символыЭкранируйте зарезервированные символы с помощью \То же самоеДля зарезервированных символов требуется экранирование.

Различия между exists/missing

В отличие от Elasticsearch, где поле может полностью отсутствовать в событии и, следовательно, действительно «не существовать», в ClickHouse все столбцы должны быть определены в схеме таблицы. Если поле не передано в событии вставки:
  • Для полей Nullable будет установлено значение NULL.
  • Для полей, не допускающих NULL (по умолчанию), будет подставлено значение по умолчанию (часто это пустая строка, 0 или эквивалентное значение).
В ClickStack мы используем второй вариант, так как Nullable не рекомендуется. Это означает, что проверка того, «существует» ли поле, в смысле Elasticsearch напрямую не поддерживается. Вместо этого можно использовать field:* или field != '', чтобы проверить наличие непустого значения. Таким образом, невозможно отличить действительно отсутствующие поля от явно пустых. На практике это различие редко вызывает проблемы в сценариях обсервабилити, но о нём важно помнить при переносе запросов между системами.
Последнее изменение 10 июня 2026 г.