# 数据库缓存优化和多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索引) - [ ] 时间戳比较(根据更新时间决定是否重新爬取)