liurenchaxin/docs/n8n_deduplication_workflow.md

3.0 KiB
Raw Blame History

n8n RSS去重工作流配置

问题解决方案

你的原始代码每次执行都会生成新的article_id,导致相同文章被重复插入。现在通过以下方案彻底解决:

1. 稳定ID生成策略

使用内容哈希而非时间戳生成稳定的文章ID

// 基于标题+发布时间+内容片段生成稳定ID
function generateStableId(title, pubDate, content) {
    const normalizedTitle = title.trim().toLowerCase();
    const contentHash = content ? content.substring(0, 100) : '';
    const dateStr = pubDate || '';
    
    const combined = normalizedTitle + '|' + dateStr + '|' + contentHash;
    
    let hash = 0;
    for (let i = 0; i < combined.length; i++) {
        const char = combined.charCodeAt(i);
        hash = ((hash << 5) - hash) + char;
        hash = hash & hash;
    }
    return Math.abs(hash).toString(16);
}

2. n8n节点配置

节点1: RSS Feed Reader

  • 配置多个RSS源
  • 设置合理的抓取频率建议30分钟-1小时

节点2: 数据预处理 (Code节点)

// 使用 scripts/n8n_deduplication_fix.js 中的代码
// 主要功能:
// 1. 生成稳定的article_id
// 2. 查询数据库已存在文章
// 3. 过滤重复内容
// 4. 添加content_hash字段

节点3: MongoDB插入 (Code节点)

// 使用 scripts/n8n_safe_insert.js 中的代码
// 使用upsert操作避免重复插入

3. 数据库索引优化

已创建的索引:

  • article_id_unique: 基于article_id的唯一索引
  • title_unique: 基于title的索引
  • content_hash_index: 基于content_hash的索引

4. 新增字段说明

字段名 类型 说明
article_id String 基于内容生成的稳定ID确保唯一性
content_hash String 内容哈希,用于检测内容变化
source_url String 原文链接
last_updated String 最后更新时间

5. 工作流执行效果

  • 去重前: 160篇文章包含80篇重复
  • 去重后: 80篇唯一文章
  • 重复检测: 支持标题和内容双重检测
  • 稳定性: 多次执行不会产生重复数据

6. 监控和维护

定期检查重复数据

python scripts/cleanup_duplicates.py

查看去重统计

// 在n8n中添加统计节点
db.articles.aggregate([
  {$group: {_id: "$title", count: {$sum: 1}}},
  {$match: {count: {$gt: 1}}},
  {$count: "duplicates"}
])

7. 最佳实践

  1. 定期清理: 每周运行一次清理脚本
  2. 监控日志: 关注n8n执行日志中的去重信息
  3. 索引维护: 定期检查索引性能
  4. 备份策略: 在大量数据操作前备份数据库

8. 故障排除

如果仍有重复数据

  1. 检查RSS源是否返回相同内容但不同时间戳
  2. 验证哈希函数是否正确处理特殊字符
  3. 确认MongoDB连接配置正确

性能优化

  1. 调整RSS抓取频率
  2. 使用批量插入而非单条插入
  3. 定期清理过期数据

现在你的n8n工作流可以安全地多次执行不会产生重复数据