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

Сопоставление типов

Elasticsearch и ClickHouse поддерживают широкий спектр типов данных, но их базовые модели хранения и выполнения запросов принципиально различаются. В этом разделе приведено сопоставление часто используемых типов полей Elasticsearch с их эквивалентами в ClickHouse, где это возможно, а также даётся контекст, помогающий при миграции. Когда эквивалента не существует, в комментариях указаны альтернативы или примечания.

Тип ElasticsearchЭквивалент в ClickHouseКомментарии
booleanUInt8 или BoolВ новых версиях ClickHouse поддерживается использование Boolean как псевдонима типа UInt8.
keywordStringИспользуется для фильтрации по точному совпадению, группировки и сортировки.
textStringПолнотекстовый поиск в ClickHouse ограничен; токенизация требует специальной логики с использованием таких функций, как tokens, в сочетании с функциями для работы с массивами.
longInt6464-битное целое число со знаком.
integerInt3232-битное знаковое целое число.
shortInt1616-битное целое число со знаком.
byteInt88-битное знаковое целое число.
unsigned_longUInt64Беззнаковое 64-битное целое число.
doubleFloat6464-битное число с плавающей точкой.
floatFloat3232-битное число с плавающей запятой.
half_floatFloat32 или BFloat16Ближайший эквивалент. В ClickHouse нет 16-битного числа с плавающей запятой. В ClickHouse есть BFloat16 — он отличается от формата half-float IEEE-754: half-float обеспечивает более высокую точность при меньшем диапазоне значений, тогда как BFloat16 жертвует точностью ради более широкого диапазона, что делает его более подходящим для задач машинного обучения.
scaled_floatDecimal(x, y)Хранит числовые значения с фиксированной точкой.
dateDateTimeЭквивалентные типы дат с точностью до секунды.
date_nanosDateTime64ClickHouse поддерживает наносекундную точность с DateTime64(9).
binaryString, FixedString(N)Необходимо декодировать двоичные поля из base64.
ipIPv4, IPv6Доступны нативные типы IPv4 и IPv6.
objectNested, Map, Tuple, JSONClickHouse умеет моделировать JSON-подобные объекты с помощью Nested или JSON.
flattenedStringТип flattened в Elasticsearch хранит целые объекты JSON в виде отдельных полей, обеспечивая гибкий доступ к вложенным ключам без строгой схемы и без необходимости полного описания mapping. В ClickHouse аналогичную функциональность можно реализовать с использованием типа String, но при этом обработка должна выполняться в материализованных представлениях.
nestedNestedСтолбцы Nested в ClickHouse дают аналогичную семантику сгруппированным подполям при условии использования параметра flatten_nested=0.
joinН/ДНет прямого понятия отношений типа «родитель–потомок». В ClickHouse это не требуется, так как поддерживаются соединения (JOIN) между таблицами.
aliasAlias модификатор столбцаПсевдонимы поддерживаются через модификатор поля. К этим псевдонимам можно применять функции, например: size String ALIAS formatReadableSize(size_bytes)
типы range (*_range)Tuple(start, end) или Array(T)В ClickHouse нет собственного типа диапазона, но числовые диапазоны и диапазоны дат можно представить с помощью структур Tuple(start, end) или Array. Для IP-диапазонов (ip_range) храните значения CIDR как String и проверяйте их с помощью таких функций, как isIPAddressInRange(). В качестве альтернативы рассмотрите использование словарей поиска на основе ip_trie для эффективной фильтрации.
aggregate_metric_doubleAggregateFunction(...) и SimpleAggregateFunction(...)Используйте состояния агрегатных функций и материализованные представления для моделирования предварительно агрегированных метрик. Все агрегатные функции поддерживают агрегатные состояния.
гистограммаTuple(Array(Float64), Array(UInt64))Вручную задавайте бакеты и значения счётчиков с помощью массивов или пользовательских схем.
annotated-textStringНет встроенной поддержки поиска с учетом сущностей или аннотаций.
completion, search_as_you_typeН/ДНет нативного движка автодополнения или подсказок. Это можно реализовать с помощью функций из раздела String и функций поиска в строках.
semantic_textН/ДНет встроенного семантического поиска — генерируйте векторные представления (эмбеддинги) и используйте векторный поиск.
token_countInt32Используйте во время ингестии для ручного подсчёта числа токенов, например с помощью функции length(tokens()) вместе с материализованным столбцом
dense_vectorArray(Float32)Используйте массивы для хранения эмбеддингов
sparse_vectorMap(UInt32, Float32)Используйте Map для моделирования разрежённых векторов. Встроенная поддержка разрежённых векторов отсутствует.
rank_feature / rank_featuresFloat32, Array(Float32)Нет нативного бустинга на этапе выполнения запроса, но его можно реализовать вручную в логике ранжирования.
geo_pointTuple(Float64, Float64) или PointИспользуйте кортеж (широта, долгота). Point доступен как тип данных ClickHouse.
geo_shape, shapeRing, LineString, MultiLineString, Polygon, MultiPolygonВстроенная поддержка геометрических фигур и пространственной индексации.
percolatorН/ДВ системе нет понятия индексирования запросов. Вместо этого используйте стандартный SQL + инкрементные материализованные представления.
versionStringВ ClickHouse нет встроенного типа данных для версий. Сохраняйте версии как строки и при необходимости используйте пользовательские функции (UDF) для семантических сравнений. Если требуются диапазонные запросы, рассмотрите возможность нормализации до числовых форматов.

Примечания

  • Массивы: в Elasticsearch все поля изначально поддерживают массивы. В ClickHouse массивы должны быть явно определены (например, Array(String)), при этом есть преимущество: к конкретным позициям можно обращаться и выполнять по ним запросы, например an_array[1].

  • Мультиполя (multi-fields): Elasticsearch позволяет индексировать одно и то же поле несколькими способами (например, как text и keyword). В ClickHouse этот паттерн необходимо моделировать с помощью отдельных столбцов или представлений.

  • Типы Map и JSON — в ClickHouse тип Map часто используется для моделирования динамических структур ключ-значение, таких как resourceAttributes и logAttributes. Этот тип обеспечивает гибкую бессхемную ингестию, позволяя добавлять произвольные ключи во время выполнения — по духу аналогично JSON-объектам в Elasticsearch. Однако есть важные ограничения, которые следует учитывать:

    • Единый тип значений: столбцы ClickHouse Map должны иметь единый тип значения (например, Map(String, String)). Значения смешанных типов не поддерживаются без приведения типов.
    • Издержки по производительности: доступ к любому ключу в Map требует загрузки всей структуры в память, что может быть неоптимально с точки зрения производительности.
    • Отсутствие подстолбцов: в отличие от JSON, ключи в Map не представлены как полноценные подстолбцы, что ограничивает возможности ClickHouse по индексированию, сжатию и эффективному выполнению запросов.

    Из‑за этих ограничений ClickStack уходит от использования Map в пользу расширенного типа JSON в ClickHouse. Тип JSON устраняет многие недостатки Map:

    • Настоящее колоночное хранение: каждый JSON‑путь хранится как подстолбец, что позволяет эффективно сжимать данные, выполнять фильтрацию и векторизованные запросы.

    • Поддержка смешанных типов: разные типы данных (например, целые числа, строки, массивы) могут сосуществовать по одному и тому же пути без приведения или унификации типов.

    • Масштабируемость на уровне файловой системы: внутренние ограничения на количество динамических ключей (max_dynamic_paths) и типов (max_dynamic_types) предотвращают взрывное увеличение числа файлов столбцов на диске даже при высоком кардинальном наборе ключей.

    • Плотное хранение: значения null и отсутствующие значения хранятся разреженно, чтобы избежать лишних накладных расходов.

      Тип JSON особенно хорошо подходит для нагрузок в области наблюдаемости, предлагая гибкость бессхемной ингестии при производительности и масштабируемости, сравнимых с нативными типами ClickHouse — что делает его идеальной заменой Map в полях с динамическими атрибутами.

      Для получения дополнительной информации о типе JSON мы рекомендуем ознакомиться с JSON guide и статьёй "How we built a new powerful JSON data type for ClickHouse".