第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 ★,°:.☆( ̄▽ ̄)/.°★* 。