跳转到主要内容

在 ClickStack 和 Elastic 中搜索

ClickHouse 是原生支持 SQL 的引擎,从底层起就专为高性能分析型工作负载而设计。相比之下,Elasticsearch 提供的是类 SQL 接口,会将 SQL 转换到底层的 Elasticsearch 查询 DSL——这意味着 SQL 并非其原生能力,而且其功能一致性也比较有限。 ClickHouse 不仅支持完整的 SQL,还扩展了一系列面向可观测性的函数,例如 argMaxhistogramquantileTiming,从而简化了对结构化日志、指标和链路追踪数据的查询。 对于简单的日志和 trace 探索,ClickStack UI (HyperDX) 提供了Lucene 风格语法,支持通过直观的文本过滤来执行字段-值查询、范围查询、通配符匹配等操作。这与 Elasticsearch 中的 Lucene 语法以及 Kibana Query Language 的部分元素相似。 搜索界面支持这种熟悉的语法,但会在后台将其转换为高效的 SQL WHERE 子句,因此 Kibana 用户会觉得很熟悉,同时又能在需要时利用 SQL 的强大能力。这使你能够充分利用 ClickHouse 中丰富的字符串搜索函数相似度函数date time functions 下面,我们将比较 ClickStack 和 Elasticsearch 的 Lucene 查询语言。

ClickStack 搜索语法 vs Elasticsearch 查询字符串

ClickStack 和 Elasticsearch 都提供灵活的查询语言,便于直观地过滤日志和 trace。Elasticsearch 的查询字符串与其 DSL 和索引引擎紧密集成,而 ClickStack 支持一种受 Lucene 启发的语法,底层会将其转换为 ClickHouse SQL。下表概述了两套系统中常见搜索模式的行为,重点说明了两者在语法上的相似之处以及后端执行方式上的差异。

存在/缺失差异

与 Elasticsearch 不同,在 Elasticsearch 中,某个字段可以在事件中被完全省略,因此是真正的“不存在”;而 ClickHouse 要求表 schema 中的所有列都必须存在。如果插入事件时未提供某个字段:
  • 对于 Nullable 字段,它会被设置为 NULL
  • 对于不可为 NULL 的字段 (默认情况) ,它会被填充为默认值 (通常为空字符串、0 或其他等效值) 。
在 ClickStack 中,我们采用后一种方式,因为 Nullable 不推荐 这意味着,无法直接按照 Elasticsearch 中的语义来检查某个字段是否“存在”。 相反,你可以使用 field:*field != '' 来检查该字段是否具有非空值。因此,无法区分字段是真正缺失,还是被显式设置为空。 在实践中,这种差异很少会对可观测性场景造成问题,但在不同系统之间转换查询时,仍需注意这一点。
最后修改于 2026年7月2日