ClickHouseNotes

第 29 章:与 Elasticsearch 对比

zjc 于 2026-01-29 发布

这是《ClickHouse 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 ClickHouse 和 Elasticsearch 都是常见的数据平台,但优化目标不同:前者面向大规模扫描聚合,后者面向搜索、倒排检索和可观测性场景。

29.1 核心差异

维度 ClickHouse Elasticsearch
存储模型 列式 面向文档,倒排索引
强项 大范围聚合分析 全文检索、相关性搜索
写入 批量 append 文档近实时写入
更新 Merge 语义 文档 update / delete
聚合 强,成本可控 可用,深度聚合成本高
查询模式 SQL DSL / QL
典型场景 数仓、报表、行为分析 搜索、日志检索、APM

29.2 日志场景

Elasticsearch:

优点:检索表达式丰富、生态成熟、权限和索引生命周期完善
代价:大范围聚合和长期留存成本高

ClickHouse:

优点:压缩率高、扫描聚合快、长期存储成本低
代价:全文检索和相关性排序能力不如专门搜索系统

常见组合:

Kafka
  -> Elasticsearch:最近 7 天检索
  -> ClickHouse:6 个月或更长期分析

29.3 用户行为分析

漏斗、留存、多维聚合:

SELECT city_id, event_type, count(), sum(amount)
FROM analytics.events
WHERE event_date = today()
GROUP BY city_id, event_type;

这类查询通常更适合 ClickHouse。若需要“搜索符合条件的一批用户”,再用 Elasticsearch 或业务检索服务。

29.4 指标监控

常见选择:

需求 方案
高基数指标长期存储 ClickHouse / TSDB
指标采集与告警 Prometheus + TSDB
日志与 trace 检索 Elasticsearch / Loki / ClickHouse
统一可观测性 根据规模和查询模式选择

ClickHouse 可以存 Prometheus 长期指标,但告警链路通常仍由 Prometheus 或其他监控服务承担。

29.5 更新语义

ClickHouse:

ReplacingMergeTree 后台替换
CollapsingMergeTree 正负抵消
查询需处理版本

Elasticsearch:

按文档 ID update / delete
近实时可见
segment merge 后清理

如果业务核心是文档 ID 级更新和检索,Elasticsearch 更自然;如果是分析快照,ClickHouse 的版本化合并模型更有优势。

29.6 容量与性能

比较时要使用相同条件:

  1. 相同数据集;
  2. 相同压缩和索引配置;
  3. 相同查询集;
  4. 相同并发;
  5. 相同硬件;
  6. 相同保留期;
  7. 相同一致性要求。

Elasticsearch 索引、副本和查询缓存会消耗较多内存;ClickHouse 的成本主要来自磁盘扫描、合并和高并发查询 CPU。

29.7 选型流程

1. 查询是检索为主还是聚合为主?
2. 是否需要全文和相关性行?
3. 数据保留多久?
4. 写入是批量流还是文档更新?
5. 团队运维能力?
6. 成本模型如何?
7. 是否可以两系统协同?

29.8 常见误区

误区 修正
ClickHouse 可以替代所有搜索 全文检索不是它的核心强项
Elasticsearch 聚合一定慢 取决于规模、映射和查询
只比较单条 SQL 耗时 要看并发、成本和保留期
双写一定能一致 需要边界和对账
迁移后 schema 照搬 要重新建模

本章小结

ClickHouse 与 Elasticsearch 是互补关系。ClickHouse 擅长大规模分析、预聚合和长期存储;Elasticsearch 擅长全文检索和文档化查询。根据查询模式、更新语义和成本选择,而不是简单追求一个系统解决所有问题。

思考题

  1. 哪些日志查询更适合 Elasticsearch?
  2. 哪些行为分析更适合 ClickHouse?
  3. 两系统并存的边界和口径如何设计?
  4. 更新语义有什么差异?
  5. 如何做公平的性能对比?