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».
- Единый тип значений: столбцы