[n8n] 全文检索(FTS)集成 | Mermaid图表生成

发布于:2025-08-29 ⋅ 阅读:(14) ⋅ 点赞:(0)

第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 模糊匹配+相关性排序

总结

全文检索集成通过:

  1. 专用索引表实现毫秒级响应
  2. 智能的模糊匹配算法
  3. 自动化的数据同步
  4. 精准的相关性排序

为工作流管理系统提供专业级搜索体验。下一章将介绍可视化功能: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, '&lt;')  // 防XSS
    .replace(/>/g, '&gt;')
    .replace(/"/g, '&quot;');
}

使用示例

请求示例

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"
}

渲染效果

性能优化

  1. 缓存机制:对已生成的图表进行MD5缓存
  2. 批量处理:支持多个工作流同时转换
  3. 懒加载:仅在请求时生成图表
  4. 增量更新:监听工作流变更事件

总结

Mermaid图表生成通过:

  1. 自动化转换技术
  2. 清晰的视觉呈现
  3. 标准化的输出格式
  4. 便捷的集成方式

为工作流管理系统提供了强大的可视化能力。本系列教程至此已完成全部核心功能的讲解

END ★,°:.☆( ̄▽ ̄)/.°★* 。


网站公告

今日签到

点亮在社区的每一天
去签到