Spaces:
Running
Running
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索引)
- [ ] 时间戳比较(根据更新时间决定是否重新爬取)
|