Перейти к основному содержанию
Elasticsearch и ClickHouse поддерживают широкий спектр типов данных, но их нижележащее хранилище и модели запросов фундаментально различаются. В этом разделе приведено сопоставление часто используемых типов полей Elasticsearch с их эквивалентами в ClickHouse, где они существуют, а также дан контекст, который поможет при миграции. Если эквивалента нет, в комментариях приведены альтернативы или примечания.
Тип ElasticsearchЭквивалент в ClickHouseПримечания
booleanUInt8 или BoolВ новых версиях ClickHouse Boolean поддерживается как псевдоним для UInt8.
keywordStringИспользуется для фильтрации по точному совпадению, группировки и сортировки.
textStringВозможности полнотекстового поиска в ClickHouse ограничены; токенизация требует пользовательской логики с использованием таких функций, как tokens, в сочетании с функциями для работы с массивами.
longInt6464-битное целое число со знаком.
integerInt3232-битное целое число со знаком.
shortInt1616-битное целое число со знаком.
byteInt88-битное целое число со знаком.
unsigned_longUInt6464-битное целое число без знака.
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, JSONВ ClickHouse JSON-подобные объекты можно моделировать с помощью Nested или JSON.
flattenedStringТип flattened в Elasticsearch хранит целые объекты JSON как отдельные поля, обеспечивая гибкий, бессхемный доступ к вложенным ключам без полного mapping. В ClickHouse похожую функциональность можно реализовать с помощью типа String, но для этого потребуется обработка в materialized view.
nestedNestedСтолбцы ClickHouse Nested предоставляют схожую семантику для сгруппированных вложенных полей, если используется flatten_nested=0.
joinNAПрямого аналога отношений parent-child нет. В ClickHouse это и не требуется, так как поддерживаются JOIN между таблицами.
aliasAlias модификатор столбцаПсевдонимы поддерживаются через модификатор поля. К таким псевдонимам можно применять функции, например size String ALIAS formatReadableSize(size_bytes)
range types (*_range)Tuple(start, end) или Array(T)В ClickHouse нет встроенного типа range, но числовые диапазоны и диапазоны дат можно представить с помощью структур Tuple(start, end) или Array. Для диапазонов IP (ip_range) храните значения CIDR как String и проверяйте их с помощью функций вроде isIPAddressInRange(). В качестве альтернативы можно использовать lookup-словари на основе ip_trie для эффективной фильтрации.
aggregate_metric_doubleAggregateFunction(...) и SimpleAggregateFunction(...)Используйте состояние агрегатной функции и materialized view для моделирования предварительно агрегированных метрик. Все функции агрегации поддерживают состояние агрегатной функции.
histogramTuple(Array(Float64), Array(UInt64))Вручную представляйте бакеты и счётчики с помощью массивов или пользовательских схем.
annotated-textStringНет встроенной поддержки поиска с учётом сущностей или аннотаций.
completion, search_as_you_typeNAНет встроенного движка для автодополнения или подсказок. Это можно воспроизвести с помощью String и функций поиска.
semantic_textNAНет встроенного семантического поиска — сгенерируйте эмбеддинги и используйте векторный поиск.
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Встроенная поддержка геометрических объектов и пространственной индексации.
percolatorNAКонцепция индексации запросов отсутствует. Вместо этого используйте стандартный SQL и incremental materialized views.
versionStringВ ClickHouse нет встроенного типа для версий. Храните версии как строки и при необходимости используйте пользовательские функции (UDF) для семантического сравнения. Если нужны запросы по диапазону, рассмотрите нормализацию к числовым форматам.

Примечания

  • Массивы: в Elasticsearch все поля изначально поддерживают массивы. В ClickHouse массивы должны быть явно определены (например, Array(String)); их преимущество в том, что к конкретным позициям можно обращаться и выполнять по ним запросы, например an_array[1].
  • Мультиполя: Elasticsearch позволяет индексировать одно и то же поле несколькими способами (например, и как text, и как keyword). В ClickHouse такой подход нужно моделировать с помощью отдельных столбцов или представлений.
  • Типы Map и JSON - в ClickHouse тип Map обычно используется для моделирования динамических структур ключ-значение, таких как resourceAttributes и logAttributes. Этот тип обеспечивает гибкую ингестию без схемы, позволяя добавлять произвольные ключи во время выполнения, — по смыслу это похоже на объекты JSON в Elasticsearch. Однако важно учитывать следующие ограничения:
    • Единый тип значений: столбцы Map в ClickHouse должны иметь согласованный тип значений (например, Map(String, String)). Значения смешанных типов не поддерживаются без приведения.
    • Издержки производительности: доступ к любому ключу в Map требует загрузки всей структуры Map в память, что может негативно сказываться на производительности.
    • Нет подстолбцов: в отличие от JSON, ключи в Map не представлены как настоящие подстолбцы, что ограничивает возможности ClickHouse по эффективному индексированию, сжатию и выполнению запросов.
    Из-за этих ограничений ClickStack отказывается от Map в пользу улучшенного типа JSON в ClickHouse. Тип JSON устраняет многие недостатки Map:
    • Настоящее столбцовое хранение: каждый путь в JSON хранится как подстолбец, что обеспечивает эффективное сжатие, фильтрацию и векторизованное выполнение запросов.
    • Поддержка смешанных типов: разные типы данных (например, целые числа, строки, массивы) могут сосуществовать по одному и тому же пути без приведения или унификации типов.
    • Масштабируемость файловой системы: внутренние ограничения на динамические ключи (max_dynamic_paths) и типы (max_dynamic_types) предотвращают взрывной рост числа файлов столбцов на диске даже для наборов ключей большой мощности.
    • Плотное хранение: null и отсутствующие значения хранятся разреженно, чтобы избежать лишних накладных расходов. Тип JSON особенно хорошо подходит для рабочих нагрузок обсервабилити, сочетая гибкость ингестии без схемы с производительностью и масштабируемостью встроенных типов ClickHouse, — это делает его идеальной заменой Map в динамических полях атрибутов. Для получения дополнительных сведений о типе JSON рекомендуем руководство по JSON и статью «How we built a new powerful JSON data type for ClickHouse».
Последнее изменение 10 июня 2026 г.