n8n-全文检索FTS集成-Mermaid图表生成
目录
[n8n] 全文检索(FTS)集成 | Mermaid图表生成
第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 BEGIN
INSERT 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 BEGIN
DELETE 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 workflows
WHERE 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 | 模糊匹配+相关性排序 |
总结
全文检索集成通过:
- 专用索引表实现毫秒级响应
- 智能的模糊匹配算法
- 自动化的数据同步
- 精准的相关性排序
为工作流管理系统提供专业级搜索体验。下一章将介绍可视化功能:
第6章:Mermaid流程图生成
在 中,我们学会了如何快速从海量工作流中精准定位目标。
现在,我们可以轻松通过关键词、触发器甚至模糊匹配来查找工作流。
但当您找到如CustomerSupportAutomation.json
这样的复杂工作流时,面对原始JSON文件,理解其执行逻辑和数据流向就变得困难。通常您需要将其导入n8n才能查看可视化编辑器。
核心价值
将n8n工作流视为精密机器:
- 精准定位:通过全文检索快速找到目标机器
- 参数获取:通过 读取元数据
- 可视化呈现:无需运行即可获取流程图解,直观展示节点连接与数据流向
解决方案:基于Mermaid的文本化流程图生成技术,将原始JSON转换为标准流程图语法,支持在浏览器或文档中直接渲染可视化图表。
技术实现
转换流程
核心代码
1. API端点配置
// src/server.js
app.get('/api/workflows/:filename/diagram', async (req, res) => {
const workflow = await db.getWorkflowDetail(req.params.filename);
const diagram = generateMermaidDiagram(
workflow.raw_workflow.nodes,
workflow.raw_workflow.connections
);
res.json({ diagram });
});
2. 语法转换引擎
function generateMermaidDiagram(nodes, connections) {
let diagram = 'graph TD\n';
nodes.forEach(node => {
const nodeId = sanitizeNodeId(node.name);
diagram += ` ${nodeId}["${node.name}\\n(${node.type})"]\n`;
});
Object.entries(connections).forEach(([source, outputs]) => {
outputs.main?.forEach(conn => {
diagram += ` ${sanitizeNodeId(source)} --> ${sanitizeNodeId(conn.node)}\n`;
});
});
return diagram;
}
3. 节点ID标准化
function sanitizeNodeId(name) {
return name.replace(/[^\w]/g, '_').replace(/^_+|_+$/g, '');
}
应用示例
请求示例
curl http://localhost:8000/api/workflows/InvoiceProcessor.json/diagram
响应结果
{
"diagram": "graph TD\n Webhook_Trigger[\"Webhook Trigger\\n(webhook)\"]\n Extract_Data[\"Extract Data\\n(set)\"]\n Webhook_Trigger --> Extract_Data"
}
可视化效果
将返回的Mermaid文本粘贴至支持渲染的编辑器(如VS Code、GitHub Markdown)即可生成如下流程图:
总结
Mermaid流程图生成模块通过:
- 自动化语法转换
- 标准化节点命名
- 可视化渲染支持
实现了工作流逻辑的快速可视化,极大提升了复杂自动化流程的理解效率。
至此,我们已完成N8N工作流索引器项目的全部核心模块讲解~
END ★,°:.☆( ̄▽ ̄)/.°★* 。