Сопоставление типов
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, но при этом обработка должна выполняться в материализованных представлениях. |
nested | Nested | Столбцы Nested в ClickHouse дают аналогичную семантику сгруппированным подполям при условии использования параметра flatten_nested=0. |
join | Н/Д | Нет прямого понятия отношений типа «родитель–потомок». В ClickHouse это не требуется, так как поддерживаются соединения (JOIN) между таблицами. |
alias | Alias модификатор столбца | Псевдонимы поддерживаются через модификатор поля. К этим псевдонимам можно применять функции, например: 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_double | AggregateFunction(...) и SimpleAggregateFunction(...) | Используйте состояния агрегатных функций и материализованные представления для моделирования предварительно агрегированных метрик. Все агрегатные функции поддерживают агрегатные состояния. |
гистограмма | Tuple(Array(Float64), Array(UInt64)) | Вручную задавайте бакеты и значения счётчиков с помощью массивов или пользовательских схем. |
annotated-text | String | Нет встроенной поддержки поиска с учетом сущностей или аннотаций. |
completion, search_as_you_type | Н/Д | Нет нативного движка автодополнения или подсказок. Это можно реализовать с помощью функций из раздела String и функций поиска в строках. |
semantic_text | Н/Д | Нет встроенного семантического поиска — генерируйте векторные представления (эмбеддинги) и используйте векторный поиск. |
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 | Н/Д | В системе нет понятия индексирования запросов. Вместо этого используйте стандартный SQL + инкрементные материализованные представления. |
version | String | В 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".
- Единый тип значений: столбцы ClickHouse