liurenchaxin/docs/n8n_deduplication_workflow.md

111 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# n8n RSS去重工作流配置
## 问题解决方案
你的原始代码每次执行都会生成新的`article_id`,导致相同文章被重复插入。现在通过以下方案彻底解决:
### 1. 稳定ID生成策略
使用**内容哈希**而非时间戳生成稳定的文章ID
```javascript
// 基于标题+发布时间+内容片段生成稳定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节点)
```javascript
// 使用 scripts/n8n_deduplication_fix.js 中的代码
// 主要功能:
// 1. 生成稳定的article_id
// 2. 查询数据库已存在文章
// 3. 过滤重复内容
// 4. 添加content_hash字段
```
#### 节点3: MongoDB插入 (Code节点)
```javascript
// 使用 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. 监控和维护
#### 定期检查重复数据
```bash
python scripts/cleanup_duplicates.py
```
#### 查看去重统计
```javascript
// 在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工作流可以安全地多次执行不会产生重复数据