# patent_sys **Repository Path**: mingtai/patent_sys ## Basic Information - **Project Name**: patent_sys - **Description**: 专利系统 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-27 - **Last Updated**: 2026-07-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 专利查询系统 基于 FastAPI + SQLite 的专利清单查询与导入系统。支持 Excel 批量导入(14 万级,去重 + 新增)、多条件联合查询、全字段表格展示。 ## 功能特性 - **全字段展示**:专利类型、领域、专利号、专利名称、年份、缴费日期、指导价、是否报高企、备注、预定截止时间,逐行展示。 - **联合查询**(所有条件可任意组合): - 多关键字模糊查询专利名称 / 领域(`、` 分隔,如「无人机、无人直播」,命中名称同时含全部关键字 **或** 领域同时含全部关键字) - 专利号精确查询 - 年份查询(专利号前 4 位,独立索引字段) - 是否报高企(下拉) - 指导价范围 - 专利类型多选 - **Excel 导入**:流式读取 + 分批 UPSERT,自动去重(专利号已存在则更新,不存在则新增),变更检测避免无效写入。 ## 性能实测(14 万行) | 操作 | 耗时 | | ------------------------ | ------ | | 14 万行导入 | ~7.4s | | 重复导入(去重,0 新增) | ~7.2s | | 年份索引查询 | ~1.3ms | | 多关键字模糊查询 | ~47ms | | 价格 + 类型联合查询 | ~11ms | ## 目录结构 ``` patent_system/ ├── backend/ │ ├── main.py # FastAPI 应用与接口 │ ├── database.py # 表结构、索引、连接(含性能 PRAGMA) │ ├── importer.py # Excel 流式导入 + 分批 UPSERT + 清洗 │ ├── requirements.txt │ └── patent.db # SQLite 数据库(自动生成) └── frontend/ └── index.html # 单页前端 ``` ## 快速启动 ```bash cd patent_system/backend python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt uvicorn main:app --host 0.0.0.0 --port 8077 ``` 浏览器打开 [http://127.0.0.1:8077](http://127.0.0.1:8077) 即可使用。点击「导入 Excel」上传专利清单文件。 ## 接口说明 | 方法 | 路径 | 说明 | | ---- | -------------- | ------------------------------------------------------------------------------------------------------------------------------- | | GET | `/api/patents` | 联合查询,参数:`keyword` `patent_no` `year` `reported_high_tech` `price_min` `price_max` `patent_types`(可多值)`page` `size` | | GET | `/api/meta` | 返回专利类型、年份下拉数据与总数 | | POST | `/api/import` | 上传`.xlsx` 导入 | ## 性能设计要点 1. **索引**:`patent_no` 唯一索引(去重 + UPSERT),`year` / `patent_type` / `pay_date` / `reported_high_tech` / `guide_price` 单列索引。 2. **年份冗余字段**:从专利号提取年份单独存列并建索引,避免对 `patent_no` 做 `substr` 计算导致索引失效。 3. **导入性能**:`openpyxl` read_only 流式读取(不全量进内存),每 2000 行一批 `executemany`;WAL 模式 + `synchronous=NORMAL` + 临时调大 page cache。 4. **去重 / 变更检测**:`ON CONFLICT(patent_no) DO UPDATE`,并用 `content_hash` 仅在内容变化时刷新,减少无效写。 5. **查询安全**:全部参数化(`?` 占位),强制分页。 ## 关于关键字模糊查询的进一步优化 `LIKE '%关键字%'` 前导通配符无法走 B-Tree 索引,14 万行全表扫约 47ms,完全可用。若数据增长到百万级且关键字搜索为高频场景,可改用: - **SQLite FTS5 全文索引**:对 `patent_name` + `field_area` 建虚拟表,毫秒级中文分词检索。 - **切换 MySQL/PostgreSQL**:`importer.py` 与 `database.py` 的 SQL 已尽量通用,改连接驱动 + 调整 `ON CONFLICT` 语法即可迁移。 ## 切换到 MySQL(可选) 当前用 SQLite 便于零配置运行。生产环境若需 MySQL: 1. 把 `database.py` 的连接换成 `pymysql` / `mysqlclient`。 2. DDL 中 `INTEGER PRIMARY KEY AUTOINCREMENT` 改为 `BIGINT AUTO_INCREMENT`,`ON CONFLICT(...) DO UPDATE` 改为 `ON DUPLICATE KEY UPDATE`。 3. 其余查询逻辑无需改动。