SmartPagerankSearch / DATABASE_CACHE_OPTIMIZATION.md
GitHub Action
Sync from GitHub Actions (Clean Commit)
7f22d3c

数据库缓存优化和多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的数量

🔧 使用方法

爬虫(自动启用)

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导入(自动启用)

from csv_importer import CSVImporter

importer = CSVImporter(mgr)

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

XML Dump处理

# 自动检测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文件类型:

# 检测逻辑
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新增方法

# 检查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是否存在:

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数据

# 第一次导入
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: 递归爬取已爬过的站点

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

场景3: CSV批量导入去重

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

📊 性能对比

无缓存检查

  • 1000个页面,全部重新爬取
  • 处理时间:~10分钟
  • 数据库写入:1000次

有缓存检查(假设50%已存在)

  • 1000个页面,只爬取500个新页面
  • 处理时间:~5分钟(节省50%)
  • 数据库写入:500次(减少50%)

⚙️ 配置选项

启用/禁用缓存检查

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

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

CSV导入

# 启用(默认)
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索引)
  • 时间戳比较(根据更新时间决定是否重新爬取)