Отображение типов
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 IEE-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 | Развёрнутый тип в Elasticsearch хранит целые JSON-объекты как отдельные поля, обеспечивая гибкий, безсхемный доступ к вложенным ключам без полного отображения. В ClickHouse аналогичная функциональность может быть достигнута с использованием типа String, но требует обработки в материализованных представлениях. |
nested | Nested | Столбцы Nested в ClickHouse обеспечивают аналогичную семантику для сгруппированных подполей, при условии что пользователи используют flatten_nested=0 . |
join | NA | Нет прямого понятия родительских и дочерних отношений. Не требуется в ClickHouse, так как поддерживаются соединения между таблицами. |
alias | Alias модификатор столбца | Псевдонимы поддерживаются через модификатор полей. Функции могут применяться к этим псевдонимам, например size String ALIAS formatReadableSize(size_bytes) |
range types (*_range ) | Tuple(start, end) или Array(T) | В ClickHouse нет нативного типа диапазона, но числовые и временные диапазоны могут быть представлены с помощью структур Tuple(start, end) или Array . Для диапазонов IP (ip_range ) храните значения CIDR как String и оценивайте с помощью функций, таких как isIPAddressInRange() . Альтернативный вариант - рассмотреть ip_trie на основе справочных словарей для эффективной фильтрации. |
aggregate_metric_double | AggregateFunction(...) и SimpleAggregateFunction(...) | Используйте состояния агрегатных функций и материализованные представления для моделирования предварительно агрегированных метрик. Все агрегатные функции поддерживают агрегатные состояния. |
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) | Симулируйте разрежённые векторы с помощью карт. Нет нативной поддержки разрежённых векторов. |
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 + Инкрементные материализованные представления. |
version | String | ClickHouse не имеет нативного типа версии. Храните версии как строки и используйте пользовательские функции UDF для выполнения семантических сравнений, если это необходимо. Рассмотрите возможность нормализации до числовых форматов, если требуются диапазонные запросы. |
Заметки
-
Массивы: В Elasticsearch все поля нативно поддерживают массивы. В ClickHouse массивы должны быть явно определены (например,
Array(String)
), с преимуществом доступа и запроса к конкретным позициям, напримерan_array[1]
. -
Мультиполя: 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
) предотвращают взрыв файлов столбцов на диске, даже при наборах ключей с высокой кардинальностью. -
Плотное хранение: нули и отсутствующие значения хранятся разреженно, чтобы избежать ненужных накладных расходов.
Тип
JSON
особенно хорошо подходит для задач мониторинга, предлагая гибкость безсхемного приема с производительностью и масштабируемостью нативных типов ClickHouse — делая его идеальной заменой дляMap
в полях динамических атрибутов.Для получения дополнительной информации о типе JSON мы рекомендуем ознакомиться с руководством по JSON и статьёй "Как мы создали новый мощный тип данных JSON для ClickHouse".
- Единообразные типы значений: Столбцы ClickHouse