111 lines
3.0 KiB
Markdown
111 lines
3.0 KiB
Markdown
# 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工作流可以安全地多次执行,不会产生重复数据! |