3.0 KiB
3.0 KiB
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. 最佳实践
- 定期清理: 每周运行一次清理脚本
- 监控日志: 关注n8n执行日志中的去重信息
- 索引维护: 定期检查索引性能
- 备份策略: 在大量数据操作前备份数据库
8. 故障排除
如果仍有重复数据
- 检查RSS源是否返回相同内容但不同时间戳
- 验证哈希函数是否正确处理特殊字符
- 确认MongoDB连接配置正确
性能优化
- 调整RSS抓取频率
- 使用批量插入而非单条插入
- 定期清理过期数据
现在你的n8n工作流可以安全地多次执行,不会产生重复数据!