第5章:全文检索(FTS)集成
在前一章中,我们构建了REST API服务作为数据访问入口。
本章将介绍全文检索(FTS)集成,它如同智能搜索引擎,为工作流系统提供高效灵活的检索能力。
核心架构
前文传送:
技术选型
- SQLite FTS5:轻量级全文检索引擎
- 虚拟表技术:创建专用索引表
workflows_fts
- 自动同步机制:通过触发器保持数据一致性
功能特性
特性 | 实现原理 | 应用场景示例 |
---|---|---|
模糊匹配 | 通配符查询(term* ) | 输入"auto"匹配"automation" |
多字段联合检索 | 索引name/description等字段 | 在名称和描述中搜索关键词 |
结果相关性排序 | BM25算法计算匹配度 | 更相关的结果排在前面 |
实时同步 | INSERT/DELETE/UPDATE触发器 | 数据变更后立即生效 |
实现细节
1. FTS表创建
-- 创建虚拟表用于全文检索
CREATE VIRTUAL TABLE workflows_fts USING fts5(filename UNINDEXED, -- 仅存储不索引name, -- 工作流名称description, -- 描述文本integrations, -- 集成服务列表tags, -- 标签组content='workflows', -- 关联主表content_rowid='id' -- 关联字段
);
2. 自动同步触发器
-- 新增数据同步
CREATE TRIGGER workflows_ai AFTER INSERT ON workflows BEGININSERT INTO workflows_fts(rowid, name, description, integrations, tags)VALUES (new.id, new.name, new.description, new.integrations, new.tags);
END;-- 删除数据同步
CREATE TRIGGER workflows_ad AFTER DELETE ON workflows BEGINDELETE FROM workflows_fts WHERE rowid = old.id;
END;
3. 检索逻辑优化
def build_fts_query(raw_query: str) -> str:"""构造FTS查询语句"""terms = [f"{term.strip()}*" for term in raw_query.split() if term.strip()]return " AND ".join(terms) # 转换为"term1* AND term2*"格式
接口增强
1. 搜索端点升级
app.get('/api/workflows', async (req, res) => {const { q, trigger, page = 1 } = req.query;// 构造FTS查询条件const ftsCondition = q ? `AND rowid IN (SELECT rowid FROM workflows_fts WHERE workflows_fts MATCH '${buildFTSQuery(q)}'ORDER BY rank)` : '';const results = await db.query(`SELECT * FROM workflowsWHERE 1=1 ${ftsCondition}LIMIT 20 OFFSET ${(page-1)*20}`);res.json(results);
});
2. 结果排序优化
-- 按相关性排序的查询示例
SELECT w.*
FROM workflows w
JOIN workflows_fts fts ON w.id = fts.rowid
WHERE workflows_fts MATCH 'email* automation*'
ORDER BY rank;
性能对比
检索方式 | 10万条数据平均耗时 | 支持特性 |
---|---|---|
传统LIKE查询 | 1200ms | 基础模糊匹配 |
FTS5检索 | 35ms | 模糊匹配+相关性排序 |
总结
全文检索集成通过:
- 专用索引表实现毫秒级响应
- 智能的模糊匹配算法
- 自动化的数据同步
- 精准的相关性排序
为工作流管理系统提供专业级搜索体验。下一章将介绍可视化功能:Mermaid图表生成
第6章:Mermaid图表生成
在前一章中,我们实现了全文检索功能。本章将介绍Mermaid图表生成功能,它如同智能绘图仪,将复杂的工作流JSON转换为可视化流程图。
核心架构
技术选型
- Mermaid.js:基于文本的图表生成库
- 语法转换引擎:将n8n节点转换为Mermaid语法
- 响应式渲染:支持实时预览和动态更新
功能特性
特性 | 实现原理 | 应用场景 |
---|---|---|
自动布局 | 基于graph TD 的拓扑排序 | 避免手动调整节点位置 |
智能标签 | 融合节点名称和类型 | 快速识别节点功能 |
多级连接 | 解析connections 嵌套结构 | 准确呈现复杂工作流 |
错误容忍 | 自动跳过无效节点 | 保证生成过程稳定性 |
实现细节
1. 核心转换函数
function generateMermaidDiagram(nodes, connections) {let diagram = 'graph TD\n';// 节点生成nodes.forEach(node => {const safeId = node.id.replace(/[^a-zA-Z0-9]/g, '_');diagram += ` ${safeId}["${node.name}\\n(${node.type})"]\n`;});// 连接生成Object.entries(connections).forEach(([source, outputs]) => {outputs.forEach(output => {output.forEach(conn => {diagram += ` ${source} --> ${conn.node}\n`;});});});return diagram;
}
2. 端点实现
app.get('/api/workflows/:id/diagram', async (req, res) => {const workflow = await db.getWorkflow(req.params.id);if (!workflow) return res.status(404).send('Workflow not found');const diagram = generateMermaidDiagram(workflow.nodes,workflow.connections);res.json({ diagram });
});
3. 安全处理
function sanitizeMermaidText(text) {return text.replace(/</g, '<') // 防XSS.replace(/>/g, '>').replace(/"/g, '"');
}
使用示例
请求示例
curl http://localhost:8000/api/workflows/order_processing/diagram
响应示例
{"diagram": "graph TD\n Webhook[\"订单Webhook\\n(webhook)\"]\n Validate[\"验证数据\\n(function)\"]\n DB[\"写入数据库\\n(postgres)\"]\n Webhook --> Validate\n Validate --> DB"
}
渲染效果
性能优化
- 缓存机制:对已生成的图表进行MD5缓存
- 批量处理:支持多个工作流同时转换
- 懒加载:仅在请求时生成图表
- 增量更新:监听工作流变更事件
总结
Mermaid图表生成通过:
自动化转换技术
- 清晰的视觉呈现
- 标准化的输出格式
- 便捷的
集成
方式
为工作流管理系统提供了强大的可视化能力。本系列教程至此已完成全部核心功能的讲解
END ★,°:.☆( ̄▽ ̄)/.°★* 。