fix: 第8轮搜索深度审计修复 — 缓存失效、Redis重试、中文标签、翻页稳定性等12项
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s

CRITICAL:
- invalidate_search_cache 清理 atm:* 缓存(MeSH ATM扩展不再用过期结果)
- Pro 方案 api_quota_per_day 1000→10000(修复低于 Free 的数据错误)
- CacheService/RateLimitMiddleware Redis 连接失败60秒自动重试(原永久降级)
- 普通搜索中文输入自动匹配 GlobalTag.name_zh(如"肺癌"通过MeSH标签关联文献)
- AdvancedPubSearchView resolveQuery 添加 seen Set 检测交替 #N 循环引用

HIGH:
- 限速器 _burst_windows 每500请求清理过期条目(防止内存泄漏)
- cron daily_ftp_update 末尾调用 invalidate_search_cache()(自动管道不再用过期缓存)

MEDIUM:
- _apply_order_by ASC 排序加 id tiebreaker(title/journal/first_author翻页跳行/重复)
- _keyset_condition 所有 is_(None) 加 id tiebreaker + __NULL__ 哨兵值
- _field_condition("all") 默认tsvector路径加 journal/journal_iso ILIKE 兜底
- SearchView restoreFromQuery date_preset/year_from/year_to 优先顺序修复

docs: 更新 12/13 搜索文档,移除 CLAUDE.md 陈旧 SQLite 提及
This commit is contained in:
34047007@qq.com
2026-07-28 11:02:29 +08:00
parent c50831d1d8
commit 73f9468384
34 changed files with 696 additions and 218 deletions
+29 -9
View File
@@ -118,7 +118,7 @@ EDAT 对应字段:`GlobalLiterature.entrez_date`DATE,新增字段,迁
pubmed_filter:
mesh_include_categories: ["C04"]
mesh_include_subcategories: ["C04.557", "C04.588", "C04.697"]
mesh_cross_include: ["E02.319", "E02.815", "D27.505"]
mesh_cross_include: ["E02.319", "E02.815", "D27.505.954.248"]
pub_type_prefer:
- "Guideline"
- "Randomized Controlled Trial"
@@ -135,6 +135,16 @@ pubmed_filter:
- "Comment"
```
**三层过滤逻辑**`_is_oncology()` 实现):
| 层级 | 条件 | 动作 |
|------|------|------|
| **Step 0** `pub_type_exclude` | PublicationType ∈ {Editorial, Letter, News, Comment} | ❌ 直接丢弃 |
| **Step 1** MeSH 树号匹配 | MeSH heading 在 C04Neoplasms)或 cross-include 树号(E02.319 抗癌药、E02.815 放疗、D27.505.954.248 抗肿瘤药)下 | ✅ 收录 |
| **Step 2** 文本评分兜底 | 无 MeSH 标引的文献:标题含关键词 → 收录;摘要含 ≥2 个关键词 → 收录;摘要单关键词 → 放过 | ✅/❌ 按评分 |
三层按顺序执行:Step 0 最先(直接排除),Step 1 中间(MeSH 精确匹配),Step 2 最后(无 MeSH 时的文本兜底)。
---
## 二、Pipeline 完整流程
@@ -194,15 +204,25 @@ ARQ 定时任务 (每日 FTP 更新 03:07 UTC)
┌─────────────────────────────────────────────────────────┐
│ Step 3: 肿瘤科过滤(配置驱动,复用 _is_oncology()
│ Step 3: 肿瘤科过滤(三层,配置驱动,复用 _is_oncology()
│ │
│ 对每篇文章的 MeSH Headings[] 逐一检查:
if 任一 heading.ui 在 mesh_include_categories 中
→ 保留
elif 任一 heading.ui 在 mesh_cross_include 中
→ 保留(交叉领域)
else
→ 丢弃
│ 对每篇文章按三层逐一判断:
Step 0 — 排除类型检查:
│ if publication_type ∈ {Editorial, Letter, News,
Comment}
→ ❌ 丢弃(无需往下判断)
│ Step 1 — MeSH 树号匹配: │
│ elif 任一 heading 在 C04Neoplasms)下 → ✅ 收录 │
│ elif 任一 heading 在 cross-include 树号下 │
│ (E02.319 抗癌药 / E02.815 放疗 /│
│ D27.505.954.248 抗肿瘤药) → ✅ 收录 │
│ │
│ Step 2 — 文本评分兜底(无 MeSH 标引时): │
│ elif 标题含关键词 → ✅ 收录 │
│ elif 摘要含 ≥2 个关键词 → ✅ 收录 │
│ else → ❌ 丢弃 │
│ │
│ 过滤结果:日均 ~5000 条总记录 → 约 400-800 条肿瘤相关 │
│ 预计耗时:1-2 分钟 │