目录

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

总结

全文检索集成通过:

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

为工作流管理系统提供专业级搜索体验。下一章将介绍可视化功能:


第6章:Mermaid流程图生成

在 中,我们学会了如何快速从海量工作流中精准定位目标。

现在,我们可以轻松通过关键词、触发器甚至模糊匹配来查找工作流。

但当您找到如CustomerSupportAutomation.json这样的复杂工作流时,面对原始JSON文件,理解其执行逻辑和数据流向就变得困难。通常您需要将其导入n8n才能查看可视化编辑器。

核心价值

将n8n工作流视为精密机器:

  • 精准定位:通过全文检索快速找到目标机器
  • 参数获取:通过 读取元数据
  • 可视化呈现:无需运行即可获取流程图解,直观展示节点连接与数据流向

解决方案:基于Mermaid的文本化流程图生成技术,将原始JSON转换为标准流程图语法,支持在浏览器或文档中直接渲染可视化图表。

技术实现

转换流程

https://i-blog.csdnimg.cn/direct/36c14ecb1b3245aebc4e9a737610027c.png

核心代码

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)即可生成如下流程图:

https://i-blog.csdnimg.cn/direct/5ccb9d56154442bfa556c7951e177a9f.png

总结

Mermaid流程图生成模块通过:

  1. 自动化语法转换
  2. 标准化节点命名
  3. 可视化渲染支持

实现了工作流逻辑的快速可视化,极大提升了复杂自动化流程的理解效率。

至此,我们已完成N8N工作流索引器项目的全部核心模块讲解~

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