Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

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

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

Тип Elasticsearch Эквивалент в ClickHouse Примечания
boolean UInt8 или Bool В новых версиях ClickHouse Boolean поддерживается как псевдоним для UInt8.
keyword String Используется для фильтрации по точному совпадению, группировки и сортировки.
text String Возможности полнотекстового поиска в ClickHouse ограничены; токенизация требует пользовательской логики с использованием таких функций, как tokens, в сочетании с функциями для работы с массивами.
long Int64 64-битное целое число со знаком.
integer Int32 32-битное целое число со знаком.
short Int16 16-битное целое число со знаком.
byte Int8 8-битное целое число со знаком.
unsigned_long UInt64 64-битное целое число без знака.
double Float64 64-битное число с плавающей точкой.
float Float32 32-битное число с плавающей точкой.
half_float Float32 или BFloat16 Наиболее близкий эквивалент. В ClickHouse нет 16-битного числа с плавающей точкой. В ClickHouse есть BFloat16 — он отличается от half-float IEEE-754: half-float обеспечивает более высокую точность при меньшем диапазоне, тогда как bfloat16 жертвует точностью ради более широкого диапазона, что делает его лучше подходящим для задач машинного обучения.
scaled_float Decimal(x, y) Используется для хранения числовых значений с фиксированной точкой.
date DateTime Эквивалентные типы даты и времени с точностью до секунды.
date_nanos DateTime64 ClickHouse поддерживает точность до наносекунд с DateTime64(9).
binary String, FixedString(N) Для бинарных полей требуется декодирование из base64.
ip IPv4, IPv6 Доступны встроенные типы IPv4 и IPv6.
object Nested, Map, Tuple, JSON В ClickHouse JSON-подобные объекты можно моделировать с помощью Nested или JSON.
flattened String Тип flattened в Elasticsearch хранит целые объекты JSON как отдельные поля, обеспечивая гибкий, бессхемный доступ к вложенным ключам без полного mapping. В ClickHouse похожую функциональность можно реализовать с помощью типа String, но для этого потребуется обработка в materialized view.
nested Nested Столбцы ClickHouse Nested предоставляют схожую семантику для сгруппированных вложенных полей, если используется flatten_nested=0.
join NA Прямого аналога отношений parent-child нет. В ClickHouse это и не требуется, так как поддерживаются JOIN между таблицами.
alias Alias модификатор столбца Псевдонимы поддерживаются через модификатор поля. К таким псевдонимам можно применять функции, например 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_double AggregateFunction(...) и SimpleAggregateFunction(...) Используйте состояние агрегатной функции и materialized view для моделирования предварительно агрегированных метрик. Все функции агрегации поддерживают состояние агрегатной функции.
histogram Tuple(Array(Float64), Array(UInt64)) Вручную представляйте бакеты и счётчики с помощью массивов или пользовательских схем.
annotated-text String Нет встроенной поддержки поиска с учётом сущностей или аннотаций.
completion, search_as_you_type NA Нет встроенного движка для автодополнения или подсказок. Это можно воспроизвести с помощью String и функций поиска.
semantic_text NA Нет встроенного семантического поиска — сгенерируйте эмбеддинги и используйте векторный поиск.
token_count Int32 Используйте на этапе ингестии, чтобы вручную вычислять количество токенов, например с помощью функции length(tokens()), в том числе через материализованный столбец
dense_vector Array(Float32) Используйте массивы для хранения эмбеддингов
sparse_vector Map(UInt32, Float32) Имитируйте разреженные векторы с помощью map. Встроенной поддержки разреженных векторов нет.
rank_feature / rank_features Float32, Array(Float32) Встроенного повышения релевантности во время выполнения запроса нет, но его можно реализовать вручную в логике скоринга.
geo_point Tuple(Float64, Float64) или Point Используйте кортеж вида (широта, долгота). Point также доступен как тип ClickHouse.
geo_shape, shape Ring, LineString, MultiLineString, Polygon, MultiPolygon Встроенная поддержка геометрических объектов и пространственной индексации.
percolator NA Концепция индексации запросов отсутствует. Вместо этого используйте стандартный SQL и incremental materialized views.
version String В 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».

Navigation