跳转到主要内容
Elasticsearch 和 ClickHouse 都支持丰富的数据类型,但二者的底层存储和查询模型存在本质差异。本节将常用的 Elasticsearch 字段类型映射到对应的 ClickHouse 类型 (如果有) ,并提供相关背景信息以帮助指导迁移。对于没有对应类型的情况,我们也会在注释中提供替代方案或说明。

说明

  • 数组:在 Elasticsearch 中,所有字段都原生支持数组。在 ClickHouse 中,数组必须显式定义 (例如 Array(String)) ;其优势是可以访问和查询特定位置的元素,例如 an_array[1]
  • 多字段:Elasticsearch 允许以多种方式索引同一字段 (例如同时使用 textkeyword) 。在 ClickHouse 中,这种模式必须通过单独的列或视图来建模。
  • Map 和 JSON 类型 - 在 ClickHouse 中,Map 类型通常用于表示动态键值结构,例如 resourceAttributeslogAttributes。该类型允许在运行时添加任意键,从而实现灵活的无 schema 摄取——这与 Elasticsearch 中的 JSON 对象在理念上类似。不过,也有一些重要限制需要注意:
    • 统一的值类型:ClickHouse 的 Map 列必须具有一致的值类型 (例如 Map(String, String)) 。如果不进行强制类型转换,则不支持混合类型的值。
    • 性能开销:访问 Map 中的任意键,都需要将整个 map 加载到内存中,这对性能而言可能并不理想。
    • 不支持子列:与 JSON 不同,Map 中的键不会表示为真正的子列,这限制了 ClickHouse 高效进行索引、压缩和查询的能力。
    由于这些限制,ClickStack 正在逐步弃用 Map,转而采用 ClickHouse 增强后的 JSON 类型。JSON 类型弥补了 Map 的许多不足:
    • 真正的列式存储:每个 JSON 路径都会存储为一个子列,从而实现高效的压缩、过滤和向量化查询执行。
    • 支持混合类型:不同的数据类型 (例如整数、字符串、数组) 可以在同一路径下共存,而无需强制转换或类型统一。
    • 文件系统可扩展性:对动态键 (max_dynamic_paths) 和类型 (max_dynamic_types) 的内部限制,即使在高基数键集合的情况下,也能防止磁盘上的列文件数量激增。
    • 紧凑存储:NULL 和缺失值会以稀疏方式存储,以避免不必要的开销。 JSON 类型尤其适合可观测性工作负载,既具备无 schema 摄取的灵活性,又拥有 ClickHouse 原生类型的性能和可扩展性——因此,它是动态属性字段中替代 Map 的理想选择。 如需进一步了解 JSON 类型,我们建议阅读 JSON 指南“How we built a new powerful JSON data type for ClickHouse”
最后修改于 2026年7月2日