飞轮科技 SelectDB 入选"2025 北京软件核心竞争力企业(技术研发型)"。本教程从零开始搭建 SelectDB,体验实时写入、全文检索、向量混合检索和 MCP Agent 接口四大核心能力。
关键词:Apache Doris · SelectDB · 实战教程 · 混合检索 · 向量索引 · MCP · ClickBench
前置准备
- Apache Doris 2.1+ 或 SelectDB Cloud 试用
- Docker 环境(本地体验)
- 基础 SQL 知识
Step 1:5 分钟部署 SelectDB / Apache Doris
方式一:Docker 快速启动
bash
# 拉取 Doris Docker 镜像
docker pull apache/doris:2.1.0-fe
docker pull apache/doris:2.1.0-be
# 启动 FE(Frontend)
docker run -d --name doris-fe \
-p 8030:8030 -p 9030:9030 \
apache/doris:2.1.0-fe
# 启动 BE(Backend)
docker run -d --name doris-be \
-p 8040:8040 -p 9050:9050 \
apache/doris:2.1.0-be
# 等待 FE 就绪
docker exec -it doris-fe mysql -h 127.0.0.1 -P 9030 -uroot
方式二:SelectDB Cloud(免运维)
shell
# 访问 SelectDB Cloud 控制台
# https://selectdb.com/apply/contact-us
# 创建实例后获取连接信息:
# FE Host: xxx.selectdb.com
# MySQL Port: 9030
# HTTP Port: 8030
Step 2:创建带倒排索引的日志表
sql
-- 创建数据库
CREATE DATABASE IF NOT EXISTS ai_logs;
USE ai_logs;
-- 创建日志表 + 倒排索引
CREATE TABLE inference_logs (
log_time DATETIME,
request_id VARCHAR(64),
model_name VARCHAR(32),
level VARCHAR(16),
error_msg TEXT,
context TEXT,
prompt_tokens INT,
completion_tokens INT,
latency_ms INT,
-- 倒排索引
INDEX idx_level(level) USING INVERTED,
INDEX idx_error(error_msg) USING INVERTED PROPERTIES(
"parser" = "unicode",
"support_phrase" = "true"
),
INDEX idx_context(context) USING INVERTED PROPERTIES(
"parser" = "unicode",
"support_phrase" = "true"
),
INDEX idx_model(model_name) USING INVERTED
) ENGINE=OLAP
DUPLICATE KEY(log_time)
PARTITION BY RANGE(log_time) ()
DISTRIBUTED BY HASH(request_id) BUCKETS 10
PROPERTIES (
"inverted_index_storage_format" = "V3"
);
Step 3:体验 search() 函数全文检索
3.1 基础搜索
sql
-- 简单关键词搜索
SELECT request_id, model_name, error_msg, latency_ms
FROM inference_logs
WHERE search('level:ERROR AND error_msg:"CUDA out of memory"')
AND log_time > NOW() - INTERVAL 1 HOUR
ORDER BY latency_ms DESC
LIMIT 100;
3.2 多条件组合搜索
vbnet
-- 5 种算子组合:TERM + PHRASE + RANGE + NOT + LIST
SELECT * FROM inference_logs
WHERE search('
level:ERROR
AND error_msg:"connection refused"
AND latency:[500 TO *]
AND NOT module:healthcheck
AND host:IN(gpu-node-01 gpu-node-02 gpu-node-03)
');
3.3 BM25 相关性排序
sql
-- 按相关性排序
SELECT request_id, error_msg, score() AS relevance_score
FROM inference_logs
WHERE search('error_msg:"memory allocation failed" OR error_msg:"CUDA error"')
ORDER BY score DESC
LIMIT 20;
3.4 search() + SQL 分析混用
sql
-- 搜索 + JOIN:找 OOM 错误并关联模型配置
SELECT l.request_id, l.error_msg, m.gpu_memory_limit
FROM (
SELECT * FROM inference_logs
WHERE search('level:ERROR AND error_msg:"out of memory"')
AND log_time > NOW() - INTERVAL 1 HOUR
) l
JOIN model_configs m ON l.model_name = m.model_name;
-- 搜索 + 窗口函数:追踪错误趋势
SELECT model_name,
DATE_TRUNC('hour', log_time) AS hour,
COUNT(*) AS error_count,
LAG(COUNT(*)) OVER (
PARTITION BY model_name ORDER BY DATE_TRUNC('hour', log_time)
) AS prev_hour_errors
FROM inference_logs
WHERE search('level:ERROR')
AND log_time > NOW() - INTERVAL 24 HOUR
GROUP BY model_name, DATE_TRUNC('hour', log_time);
Step 4:体验向量混合检索(Doris 4.0+)
sql
-- 创建知识库表(含向量列)
CREATE TABLE knowledge_base (
id INT,
content TEXT,
embedding FLOAT[], -- 向量列
category VARCHAR(32),
INDEX idx_content(content) USING INVERTED PROPERTIES(
"parser" = "unicode"
)
) ENGINE=OLAP
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 10;
-- 混合检索:关键词 + 向量相似度
SELECT id, content, score() AS text_score,
cosine_distance(embedding, ai_embedding('Doris 向量化优化')) AS vector_score
FROM knowledge_base
WHERE content MATCH 'Doris 性能'
ORDER BY (text_score + 1/(1+vector_score)) DESC
LIMIT 10;
Step 5:体验 MCP Agent 接口
ini
# 启动 MCP Server 连接 SelectDB
# Agent 可通过 MCP 协议直接查询数据
docker run -d --name doris-mcp \
-e DORIS_HOST=your-selectdb-host \
-e DORIS_PORT=9030 \
-e DORIS_USER=admin \
-e DORIS_PASSWORD=your-password \
selectdb/mcp-server:latest
sql
-- Agent 可执行的典型查询
-- 1. 实时数据感知
SELECT COUNT(*), SUM(amount) FROM orders WHERE dt = CURRENT_DATE;
-- 2. 用户行为分析
SELECT user_id, COUNT(DISTINCT session_id)
FROM events WHERE dt >= DATE_SUB(CURRENT_DATE, 7)
GROUP BY user_id LIMIT 100;
-- 3. 知识库检索(RAG)
SELECT content FROM knowledge_base
WHERE content MATCH '产品价格' ORDER BY score() DESC LIMIT 5;
Step 6:验证性能优势
6.1 向量化 vs 非向量化
sql
-- 开启向量化
SET enable_vectorized_engine = true;
SELECT COUNT(*), SUM(value), AVG(value) FROM big_table WHERE value > 5000;
-- 关闭向量化对比
SET enable_vectorized_engine = false;
SELECT COUNT(*), SUM(value), AVG(value) FROM big_table WHERE value > 5000;
-- 通常慢 5-10 倍
6.2 Pipeline 引擎验证
sql
SET enable_profile = true;
-- 执行多表 JOIN
SELECT o.id, c.name, p.title FROM orders o
JOIN customers c ON o.cid = c.id
JOIN products p ON o.pid = p.id
WHERE o.dt > '2026-07-01' ORDER BY o.amount DESC LIMIT 100;
-- 查看 Profile 观察 Pipeline 执行
SHOW QUERY PROFILE '/';
SelectDB 性能速查表
| 场景 | 对比 | 领先 |
|---|---|---|
| SSB | vs ClickHouse | 3 倍 |
| TPC-H | vs ClickHouse | 60 倍 |
| 25% 更新查询 | vs ClickHouse | 14 倍 |
| 100% 更新查询 | vs ClickHouse | 18 倍 |
| 数据湖查询 | vs Trino | 3-10 倍 |
| JSON 查询 | vs Elasticsearch | 2 倍 |
| 存储成本 | vs Elasticsearch | 降 50%-70% |
| 向量化提升 | Doris 1.2 vs 0.15 | 10-11 倍 |
| Pipeline 提升 | Doris 2.0 vs 火山 | +100% |
| ARM 优化 | Doris 2.1 ARM | +230% |
常见问题
Q1:SelectDB 和 Apache Doris 有什么区别? A:Apache Doris 是开源项目,SelectDB 是飞轮科技基于 Doris 内核的企业级产品,提供全托管云服务、企业级安全和 7×24 技术支持。
Q2:search() 函数和 ES query_string 完全兼容吗? A:search() 兼容 ES query_string 语法,大部分原有查询仅需将 REST API 改成 SQL WHERE 即可。支持 15 种查询算子和 Lucene 模式。
Q3:向量检索需要额外安装插件吗? A:Doris 4.0+ 原生支持向量索引和 AI 函数,无需额外插件。SelectDB Cloud 已集成这些能力。
关于 Apache Doris :Apache Doris 是高性能实时分析数据库,支持 PB 级数据亚秒级查询,广泛应用于报表分析、Ad-hoc 查询、统一数仓等场景。SelectDB 是 Apache Doris 的商业化公司,提供企业级支持和云服务。欢迎加入 Doris 社区 交流更多实践。