面向千万级图书目录(中文370万 + 英文770万)的高性能多模式检索工具。支持五种检索方式:手动单条件检索、高级多条件组合检索、表达式检索、Excel批量检索和关键词过滤。内置ISBN哈希索引实现O(1)查找,pandas向量化文本搜索,tkinter图形界面。
book_search_tool.py 或图书检索相关需求本工具的底层检索数据为中外文图书目录清单(中文370万条 + 英文770万条,共1147万条),获取方式:
scripts/
|-- book_search_tool.py # 主程序(tkinter GUI + 高级检索 + 批量检索 + 关键词检索)
|-- batch_search.py # CLI:从Excel模板批量检索
+-- keyword_search_cn.py # CLI:关键词过滤(仅中文库)
assets/
|-- config_template.json # 配置模板(用户填写路径)
references/
+-- csv_format.md # CSV数据格式规范
系统分三层:
dict {isbn: [row_indices]})实现O(1)查找search() 方法:子串匹配,支持 title/author/publisher/isbn/book_id/year 多字段 + year范围筛选search_advanced() 方法:多条件布尔逻辑组合检索,支持字段:标题/作者/出版社/ISBN/年份/编号,逻辑:AND/OR,年份支持 year_gte/year_lte 范围比较search_batch_fast() 方法:批量检索,自动调度快速路径(ISBN哈希)和回退路径(全文扫描)search_batch_fast() 使用两级策略:
search(),在 title/author/publisher 列做子串匹配此设计消除了title/副标题不一致导致不必要全表扫描的性能陷阱。
高级检索提供两种模式:
T=数学 AND P=高等教育 OR A=张三search_advanced() 核心逻辑:
mask &= cond)mask |= cond)工具需要一个或多个CSV文件。参见 references/csv_format.md 了解列格式要求。
典型目录结构:
books/
|-- english/
| |-- en_books_part1.csv
| +-- en_books_part2.csv
+-- chinese/
|-- cn_books_0.csv
|-- cn_books_1.csv
+-- cn_books_2.csv
将 assets/config_template.json 复制到项目目录重命名为 config.json,编辑路径:
{
"en_dir": "D:/Data/books/english",
"cn_dir": "D:/Data/books/chinese",
"max_results": 500,
"batch_max_per": 5
}
en_dir / cn_dir:CSV目录的绝对路径(可省略任一)max_results:GUI手动检索最大显示条数batch_max_per:批量检索每条查询最大返回条数pip install pandas openpyxl pyinstaller
Tkinter在Windows上默认随Python附带。
cd <project-dir>
python scripts/book_search_tool.py
python scripts/batch_search.py "<path/to/search_template.xlsx>"
Excel模板需含列:title、isbn13、author、publisher。结果输出为带时间戳的Excel文件。
python scripts/keyword_search_cn.py
编辑脚本修改 KEYWORDS 列表和目录路径。输出Excel含列:id、title、isbn13、匹配关键词标签。
book_search_tool.py 从 scripts/ 复制到项目根目录pyinstaller --onedir --windowed --name "图书检索工具" ^
--hidden-import openpyxl --hidden-import pandas ^
--hidden-import tkinter --hidden-import pathlib ^
--hidden-import threading --hidden-import re ^
--hidden-import json --hidden-import time ^
book_search_tool.py
config.json 复制到 dist/图书检索工具/dist/图书检索工具/ 目录打包为zip分发给用户安装:解压zip到桌面任意目录,双击 图书检索工具.exe 运行。如需桌面快捷方式,手动右键 exe → 发送到桌面快捷方式。
| 操作 | 数据规模 | 耗时 |
|---|---|---|
| ------ | --------- | ------ |
| 加载1147万条记录 | 11,471,406行 | ~75s |
| 构建ISBN哈希索引 | 9,450,000唯一ISBN | ~26s |
| 批量检索(3.4万查询,99% ISBN) | 34,039条 | ~20min |
| 关键词过滤(3关键词 × 370万行) | 3,720,000行 | ~1s |
| 高级检索多条件组合 | 11,470,000行 | <3s |
after() 配合节流机制,避免队列堆积——勿移除内部去重逻辑pd.read_csv(dtype=str) 读取,确保ISBN和ID存储为字符串而非数字字段=关键词 逻辑 字段=关键词 格式适配新数据集时:
_build_indices() 构建哈希索引,search() 执行文本扫描,search_advanced() 执行多条件布尔检索。CSV列名不同时修改 FIELD_MAP 和 COLS 映射read_template() 读取Excel查询文件,调整列匹配逻辑KEYWORDS 列表和目录路径| 症状 | 原因 | 修复 |
|---|---|---|
| ------ | ------ | ------ |
| 进度条卡在0% | after() 队列溢出 | 已内置节流;减小progress回调的step值 |
TypeError: progress_cb takes 1 arg but 2 given | build_indices() 传递 (value, task) 元组 | 使用 lambda v, t="": callback(v) |
PyInstaller: pathlib 导入错误 | spec文件hidden-import前有多余空格 | 移除空格:"pathlib" 非 " pathlib" |
| CSV编码错误 | 文件非UTF-8 | 对GBK中文文件添加 encoding='gbk' |
| ISBN匹配失败 | ISBN存储为float | 确保CSV使用 dtype=str 读取 |
| 高级检索条件行无法添加 | Canvas+Frame布局竞争 | 已在v3.1修复:改用grid布局直接堆叠 |
共 1 个版本