> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-parallel-read-in-order-multi-part.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Поиск в ClickStack и Elastic

> Поиск в ClickStack и Elastic

export const Image = ({img, alt, size = "lg", background}) => {
  const normalizedSize = ["sm", "md", "lg"].includes(size) ? size : "lg";
  const backgroundColor = background === "white" ? "white" : background === "black" ? "rgb(31 31 28)" : undefined;
  return <div className={`ch-image-${normalizedSize}`}>
      <Frame>
        <img src={img} alt={alt} style={{
    backgroundColor
  }} />
      </Frame>
    </div>;
};

<div id="search-in-clickstack-and-elastic">
  ## Поиск в ClickStack и Elastic
</div>

ClickHouse — это движок с нативной поддержкой SQL, изначально созданный для высокопроизводительных аналитических рабочих нагрузок. Elasticsearch, напротив, предоставляет SQL-подобный интерфейс, транслируя SQL в базовый DSL запросов Elasticsearch, — то есть SQL в нем не является средством первого класса, а [функциональный паритет](https://www.elastic.co/docs/explore-analyze/query-filter/languages/sql-limitations) ограничен.

ClickHouse не только поддерживает полноценный SQL, но и расширяет его набором функций, ориентированных на обсервабилити, таких как [`argMax`](/ru/reference/functions/aggregate-functions/argMax), [`histogram`](/ru/reference/functions/aggregate-functions/parametric-functions#histogram) и [`quantileTiming`](/ru/reference/functions/aggregate-functions/quantileTiming), которые упрощают выполнение запросов к структурированным журналам, метрикам и трассировкам.

Для простого анализа журналов и трассировок интерфейс ClickStack (HyperDX) предоставляет [синтаксис в стиле Lucene](/ru/clickstack/features/search) для интуитивной текстовой фильтрации по запросам вида поле-значение, диапазонам, подстановочным шаблонам и другим конструкциям. Это сопоставимо с [синтаксисом Lucene](https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-query-string-query#query-string-syntax) в Elasticsearch и элементами [Kibana Query Language](https://www.elastic.co/docs/reference/query-languages/kql).

<Image img="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/x1yhmu2ugOUu2CLP/images/use-cases/observability/hyperdx-search.webp?fit=max&auto=format&n=x1yhmu2ugOUu2CLP&q=85&s=4f77f832248fcfeac2e90c5c6ab6e54a" alt="Поиск" size="lg" width="6720" height="3380" data-path="images/use-cases/observability/hyperdx-search.webp" />

Интерфейс поиска поддерживает этот знакомый синтаксис, но за кулисами преобразует его в эффективные SQL-условия `WHERE`, что делает работу привычной для пользователей Kibana и при этом позволяет при необходимости использовать всю мощь SQL. Это позволяет задействовать весь набор [функций поиска по строкам](/ru/reference/functions/regular-functions/string-search-functions), [функций сходства](/ru/reference/functions/regular-functions/string-functions#stringJaccardIndex) и [функций даты и времени](/ru/reference/functions/regular-functions/date-time-functions) в ClickHouse.

<Image img="https://mintcdn.com/private-7c7dfe99-parallel-read-in-order-multi-part/x1yhmu2ugOUu2CLP/images/use-cases/observability/hyperdx-sql.webp?fit=max&auto=format&n=x1yhmu2ugOUu2CLP&q=85&s=3fec0de7affc341ead6a2abc1e0b6893" alt="SQL" size="lg" width="6720" height="3380" data-path="images/use-cases/observability/hyperdx-sql.webp" />

Ниже мы сравним языки запросов Lucene в ClickStack и Elasticsearch.

<div id="clickstack-vs-elasticsearch-query-string">
  ## Поисковый синтаксис ClickStack и строка запроса Elasticsearch
</div>

И ClickStack, и Elasticsearch предоставляют гибкие языки запросов для удобной фильтрации журналов и трассировок. Если строка запроса Elasticsearch тесно связана с его DSL и движком индексирования, то ClickStack поддерживает синтаксис в стиле Lucene, который под капотом переводится в ClickHouse SQL. В таблице ниже показано, как распространённые шаблоны поиска работают в обеих системах, с акцентом на сходство синтаксиса и различия в их внутреннем выполнении.

| **Возможность** | **Синтаксис ClickStack** | **Синтаксис Elasticsearch** | **Примечания** |
| - | - | - | - |
| Поиск по свободному тексту | `error` | `error` | Выполняет поиск по всем индексируемым полям; в ClickStack это преобразуется в многостолбцовый SQL `ILIKE`. |
| Совпадение по полю | `level:error` | `level:error` | Синтаксис идентичен. В ClickStack выполняется поиск точных значений полей в ClickHouse. |
| Поиск по фразе | `"disk full"` | `"disk full"` | Текст в кавычках соответствует точной последовательности; ClickHouse использует сравнение строк или `ILIKE`. |
| Совпадение фразы по полю | `message:"disk full"` | `message:"disk full"` | Преобразуется в SQL `ILIKE` или точное совпадение. |
| Условия OR | `error OR warning` | `error OR warning` | Логическое OR для терминов; обе системы поддерживают это нативно. |
| Условия AND | `error AND db` | `error AND db` | В обеих системах соответствует пересечению; для пользователя синтаксис не отличается. |
| Отрицание | `NOT error` or `-error` | `NOT 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:>=10` | `duration:>10` or `duration:>=10` | ClickStack использует стандартные 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 | функция `match` | `name:/joh?n(ath[oa]n)/` | В настоящее время не поддерживается в синтаксисе Lucene. Можно использовать SQL и функцию [`match`](/ru/reference/functions/regular-functions/string-search-functions#match) или другие [функции поиска по строкам](/ru/reference/functions/regular-functions/string-search-functions). |
| Нечеткое совпадение | `editDistance('quikc', field) = 1` | `quikc~` | В настоящее время не поддерживается в синтаксисе Lucene. В SQL можно использовать Функции расстояния, например `editDistance('rror', SeverityText) = 1`, или [другие функции сходства](/ru/reference/functions/regular-functions/string-functions#jaroSimilarity). |
| Поиск по близости | Не поддерживается | `"fox quick"~5` | В настоящее время не поддерживается в синтаксисе Lucene. |
| Повышение веса | `quick^2 fox` | `quick^2 fox` | В настоящее время не поддерживается в ClickStack. |
| Подстановочный шаблон поля | `service.*:error` | `service.*:error` | В настоящее время не поддерживается в ClickStack. |
| Экранированные специальные символы | Экранируйте зарезервированные символы с помощью `\` | То же самое | Для зарезервированных символов требуется экранирование. |

<div id="empty-value-differences">
  ## Различия между exists/missing
</div>

В отличие от Elasticsearch, где поле может полностью отсутствовать в событии и, следовательно, действительно «не существовать», в ClickHouse все столбцы должны быть определены в схеме таблицы. Если поле не передано в событии вставки:

* Для полей [`Nullable`](/ru/reference/data-types/nullable) будет установлено значение `NULL`.
* Для полей, не допускающих `NULL` (по умолчанию), будет подставлено значение по умолчанию (часто это пустая строка, 0 или эквивалентное значение).

В ClickStack мы используем второй вариант, так как [`Nullable`](/ru/reference/data-types/nullable) [не рекомендуется](/ru/concepts/best-practices/avoidnullablecolumns).

Это означает, что проверка того, «существует» ли поле, в смысле Elasticsearch напрямую не поддерживается.

Вместо этого можно использовать `field:*` или `field != ''`, чтобы проверить наличие непустого значения. Таким образом, невозможно отличить действительно отсутствующие поля от явно пустых.

На практике это различие редко вызывает проблемы в сценариях обсервабилити, но о нём важно помнить при переносе запросов между системами.
