Перейти к основному содержимому
Перейти к основному содержимому

Отображение типов

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

Тип ElasticsearchЭквивалент ClickHouseКомментарии
booleanUInt8 или BoolClickHouse поддерживает Boolean как псевдоним для UInt8 в более новых версиях.
keywordStringИспользуется для фильтрации по точному совпадению, группировки и сортировки.
textStringПолнотекстовый поиск ограничен в ClickHouse; токенизация требует пользовательской логики с использованием таких функций, как tokens, в сочетании с массивными функциями.
longInt6464-битное целое со знаком.
integerInt3232-битное целое со знаком.
shortInt1616-битное целое со знаком.
byteInt88-битное целое со знаком.
unsigned_longUInt64Беззнаковое 64-битное целое число.
doubleFloat6464-битное число с плавающей точкой.
floatFloat3232-битное число с плавающей точкой.
half_floatFloat32 или BFloat16Ближайший эквивалент. В ClickHouse нет 16-битного числа с плавающей точкой. В ClickHouse есть BFloat16 - это отличается от Half-float IEE-754: half-float предлагает более высокую точность с меньшим диапазоном, в то время как bfloat16 жертвует точностью ради более широкого диапазона, что делает его более подходящим для нагрузки машинного обучения.
scaled_floatDecimal(x, y)Хранение чисел с фиксированной точкой.
dateDateTimeЭквивалентные типы даты с точностью до секунд.
date_nanosDateTime64ClickHouse поддерживает наносекундную точность с DateTime64(9).
binaryString, FixedString(N)Требуется декодирование base64 для бинарных полей.
ipIPv4, IPv6Доступны нативные типы IPv4 и IPv6.
objectNested, Map, Tuple, JSONClickHouse может моделировать объекты, подобные JSON, с использованием Nested или JSON.
flattenedStringРазвёрнутый тип в Elasticsearch хранит целые JSON-объекты как отдельные поля, обеспечивая гибкий, безсхемный доступ к вложенным ключам без полного отображения. В ClickHouse аналогичная функциональность может быть достигнута с использованием типа String, но требует обработки в материализованных представлениях.
nestedNestedСтолбцы Nested в ClickHouse обеспечивают аналогичную семантику для сгруппированных подполей, при условии что пользователи используют flatten_nested=0.
joinNAНет прямого понятия родительских и дочерних отношений. Не требуется в ClickHouse, так как поддерживаются соединения между таблицами.
aliasAlias модификатор столбцаПсевдонимы поддерживаются через модификатор полей. Функции могут применяться к этим псевдонимам, например 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_doubleAggregateFunction(...) и SimpleAggregateFunction(...)Используйте состояния агрегатных функций и материализованные представления для моделирования предварительно агрегированных метрик. Все агрегатные функции поддерживают агрегатные состояния.
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)Симулируйте разрежённые векторы с помощью карт. Нет нативной поддержки разрежённых векторов.
rank_feature / rank_featuresFloat32, Array(Float32)Нет нативного повышения в момент запроса, но его можно смоделировать вручную в логике оценки.
geo_pointTuple(Float64, Float64) или PointИспользуйте кортеж из (широта, долгота). Point доступен как тип ClickHouse.
geo_shape, shapeRing, LineString, MultiLineString, Polygon, MultiPolygonНативная поддержка геоформ и пространственной индексации.
percolatorNAНет понятия индексирования запросов. Вместо этого используйте стандартный SQL + Инкрементные материализованные представления.
versionStringClickHouse не имеет нативного типа версии. Храните версии как строки и используйте пользовательские функции 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".