ClickHouse 实现原创内容实时分析:支持多条件筛选的搜索统计
·
ClickHouse实现原创内容实时分析:多条件筛选搜索统计
设计思路
- 数据模型设计
CREATE TABLE original_content (
content_id UUID,
title String,
content String,
author_id UInt32,
category Enum8('科技'=1, '财经'=2, '娱乐'=3),
tags Array(String),
publish_time DateTime,
like_count UInt32,
view_count UInt32,
is_original UInt8 DEFAULT 1
) ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(publish_time)
ORDER BY (category, author_id, publish_time)
PRIMARY KEY (category, author_id)
SETTINGS index_granularity = 8192;
- 索引优化
- 主键索引:
(category, author_id) - 跳数索引:
ALTER TABLE original_content ADD INDEX tag_index arrayJoin(tags) TYPE set(100) GRANULARITY 4, ADD INDEX time_index publish_time TYPE minmax GRANULARITY 2;
多条件筛选统计实现
SELECT
category,
count() AS total_content,
sum(like_count) AS total_likes,
avg(view_count) AS avg_views
FROM original_content
WHERE
publish_time >= now() - INTERVAL 7 DAY
AND is_original = 1
AND has(tags, '人工智能')
AND view_count > 1000
AND category = '科技'
GROUP BY category
ORDER BY total_likes DESC
LIMIT 10
性能优化方案
- 预聚合引擎(提升实时性)
CREATE MATERIALIZED VIEW content_stats
ENGINE = AggregatingMergeTree()
PARTITION BY toYYYYMM(publish_time)
ORDER BY (category, author_id)
AS SELECT
category,
author_id,
toStartOfHour(publish_time) AS time_bucket,
countState() AS content_count,
sumState(like_count) AS like_sum
FROM original_content
GROUP BY category, author_id, time_bucket;
- 复杂查询优化
SELECT
category,
sumMerge(content_count) AS total,
quantileMerge(0.9)(view_count) AS p90_views
FROM content_stats
WHERE
time_bucket >= '2023-01-01 00:00:00'
AND author_id IN (SELECT author_id FROM author_info WHERE level > 5)
GROUP BY category
HAVING total > 100
实时分析架构
graph LR
A[数据源] --> B[Kafka]
B --> C[ClickHouse Kafka Engine]
C --> D[原始数据表]
D --> E[物化视图]
E --> F[预聚合表]
F --> G[API查询接口]
典型场景示例
需求:统计过去24小时原创内容中,同时包含"区块链"和"元宇宙"标签,且点赞>500的科技类作者排行
SELECT
author_id,
count() AS content_count,
sum(like_count) AS total_likes
FROM original_content
WHERE
publish_time >= now() - INTERVAL 1 DAY
AND arrayExists(t -> t IN ['区块链','元宇宙'], tags)
AND like_count > 500
AND category = '科技'
GROUP BY author_id
ORDER BY total_likes DESC
LIMIT 20
最佳实践
- 冷热分离:使用
TTL自动转移历史数据 - 查询优化:
- 优先使用数值型过滤条件
- 避免全文本
LIKE查询 - 使用
PREWHERE提前过滤
- 资源控制:
SET max_memory_usage = 20000000000; SET max_threads = 16;
此方案可实现毫秒级响应千万级数据的多维度实时分析,QPS可达500+(单节点32核128GB配置)。
更多推荐

所有评论(0)