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

Примечания

  • Массивы: в 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».
Последнее изменение 25 июня 2026 г.