File size: 6,933 Bytes
7f22d3c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
# 数据库缓存优化和多Wiki支持

## 🎯 功能概述

实现了智能数据库缓存机制和多Wiki类型支持,大幅提高数据导入和处理效率。

## ✅ 已实现的功能

### 1. **数据库缓存检查** 🚀

在爬取或导入数据前,自动检查数据库中是否已存在该URL的数据,避免重复处理。

**核心功能**- ✅ URL存在性检查 (`check_url_exists`)
- ✅ 获取已有数据 (`get_url_from_db`)
- ✅ 批量URL检查 (`batch_check_urls`)
- ✅ 自动跳过已存在的URL

**使用场景**- 爬虫递归爬取时自动跳过已爬取的页面
- CSV导入时自动跳过已导入的数据
- XML Dump导入时自动跳过已处理的页面

### 2. **多Wiki类型支持** 🌐

支持多种Wiki格式的XML Dump处理:

**支持的Wiki类型**-**MediaWiki** - 标准MediaWiki格式
-**Wikipedia** - Wikipedia特定格式(自动检测)
-**Wikidata** - Wikidata格式(自动检测)
-**自动检测** - 根据dump文件自动识别类型

**不同Wiki类型的URL格式**- MediaWiki: `https://wiki.example.com/Page_Title`
- Wikipedia: `https://en.wikipedia.org/wiki/Page_Title`
- Wikidata: `https://www.wikidata.org/wiki/Q123`

### 3. **智能跳过机制**

- **爬虫**:爬取前检查数据库,已存在的URL直接跳过
- **CSV导入**:导入前检查数据库,已存在的URL自动跳过
- **XML Dump**:处理时检查数据库,已处理的页面自动跳过

## 📊 性能提升

### 效率提升

- **避免重复爬取**:已存在的URL直接跳过,节省时间和资源
- **减少数据库写入**:只导入新数据,减少I/O操作
- **加快处理速度**:特别是对于大型Wiki站点,效率提升显著

### 统计信息

导入时会显示:
- 总行数/页面数
- 成功导入数
- **跳过数(已存在)** ← 新增
- 失败数
- 晋升到Space R的数量

## 🔧 使用方法

### 爬虫(自动启用)

```python
from system_manager import SystemManager

mgr = SystemManager()

# 自动检查数据库,跳过已存在的URL
mgr.process_url_and_add("https://example.com/page", check_db_first=True)

# 递归爬取,自动跳过已存在的URL
mgr.process_url_recursive("https://example.com", max_depth=3, check_db_first=True)
```

### CSV导入(自动启用)

```python
from csv_importer import CSVImporter

importer = CSVImporter(mgr)

# 自动检查数据库,跳过已存在的URL
stats = importer.import_csv_batch(
    csv_rows,
    check_db_first=True  # 默认True
)
```

### XML Dump处理

```bash
# 自动检测Wiki类型并检查数据库
python xml_dump_processor.py wiki_dump.xml \
    --base-url "https://en.wikipedia.org" \
    --import-db \
    --check-db  # 默认启用

# 禁用数据库检查(强制重新导入)
python xml_dump_processor.py wiki_dump.xml \
    --import-db \
    --no-check-db
```

## 🔍 自动检测机制

### Wiki类型自动检测

XML处理器会自动检测dump文件类型:

```python
# 检测逻辑
if "wikipedia" in site_name.lower():
    wiki_type = "wikipedia"
elif "wikidata" in site_name.lower():
    wiki_type = "wikidata"
else:
    wiki_type = "mediawiki"
```

### URL格式自动适配

根据检测到的Wiki类型,自动使用对应的URL格式:

- **Wikipedia**: `{base_url}/wiki/{title}`
- **MediaWiki**: `{base_url}/{title}`
- **Wikidata**: `{base_url}/wiki/{title}`

## 📝 代码实现

### SystemManager新增方法

```python
# 检查URL是否存在
exists = mgr.check_url_exists("https://example.com/page")

# 获取已有数据
data = mgr.get_url_from_db("https://example.com/page")

# 批量检查
urls = ["url1", "url2", "url3"]
results = mgr.batch_check_urls(urls)
```

### 数据库查询优化

使用Qdrant的Filter查询,高效检查URL是否存在:

```python
points, _ = client.scroll(
    collection_name=SPACE_X,
    scroll_filter=models.Filter(
        must=[
            models.FieldCondition(
                key="url",
                match=models.MatchValue(value=url)
            )
        ]
    ),
    limit=1
)
```

## 🎯 使用场景

### 场景1: 增量导入Wikipedia数据

```bash
# 第一次导入
python xml_dump_processor.py enwiki-latest-pages.xml \
    --base-url "https://en.wikipedia.org" \
    --import-db

# 第二次导入(更新数据)
# 自动跳过已存在的页面,只导入新页面
python xml_dump_processor.py enwiki-latest-pages-new.xml \
    --base-url "https://en.wikipedia.org" \
    --import-db \
    --check-db
```

### 场景2: 递归爬取已爬过的站点

```python
# 如果站点已经部分爬取过
# 新的爬取会自动跳过已存在的页面
mgr.process_url_recursive("https://example.com", max_depth=5, check_db_first=True)
```

### 场景3: CSV批量导入去重

```python
# CSV导入时自动去重
importer.import_csv_file("large_wiki.csv", check_db_first=True)
# 只会导入数据库中不存在的行
```

## 📊 性能对比

### 无缓存检查
- 1000个页面,全部重新爬取
- 处理时间:~10分钟
- 数据库写入:1000次

### 有缓存检查(假设50%已存在)
- 1000个页面,只爬取500个新页面
- 处理时间:~5分钟(节省50%)
- 数据库写入:500次(减少50%)

## ⚙️ 配置选项

### 启用/禁用缓存检查

```python
# 启用(默认)
mgr.process_url_and_add(url, check_db_first=True)

# 禁用(强制重新爬取)
mgr.process_url_and_add(url, check_db_first=False)
```

### CSV导入

```python
# 启用(默认)
importer.import_csv_batch(rows, check_db_first=True)

# 禁用
importer.import_csv_batch(rows, check_db_first=False)
```

## 🔄 工作流程

### 标准流程(启用缓存)

```
URL/数据输入

检查数据库
    ├─ 存在 → 跳过,返回已有数据
    └─ 不存在 → 继续处理

爬取/解析数据

向量化和存储

完成
```

### 强制处理流程(禁用缓存)

```
URL/数据输入

直接爬取/解析(忽略数据库)

向量化和存储(可能覆盖已有数据)

完成
```

## 📚 相关文件

- `system_manager.py` - 数据库检查方法
- `csv_importer.py` - CSV导入时的缓存检查
- `xml_dump_processor.py` - XML处理时的缓存检查和Wiki类型检测
- `web_server.py` - 后端API调用

## 🎉 优势总结

1. **效率提升**:避免重复爬取,节省时间和资源
2. **智能适配**:自动检测Wiki类型,使用正确的URL格式
3. **增量更新**:支持增量导入,只处理新数据
4. **灵活控制**:可以启用或禁用缓存检查
5. **统计透明**:清楚显示跳过的数据数量

## 🚀 后续优化

可能的改进方向:
- [ ] URL规范化(处理URL变体,如末尾斜杠)
- [ ] 批量查询优化(一次性查询多个URL)
- [ ] 缓存索引(在内存中维护URL索引)
- [ ] 时间戳比较(根据更新时间决定是否重新爬取)