fix: 第8轮搜索深度审计修复 — 缓存失效、Redis重试、中文标签、翻页稳定性等12项
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:
+29
-9
@@ -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 在 C04(Neoplasms)或 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 在 C04(Neoplasms)下 → ✅ 收录 │
|
||||
│ elif 任一 heading 在 cross-include 树号下 │
|
||||
│ (E02.319 抗癌药 / E02.815 放疗 /│
|
||||
│ D27.505.954.248 抗肿瘤药) → ✅ 收录 │
|
||||
│ │
|
||||
│ Step 2 — 文本评分兜底(无 MeSH 标引时): │
|
||||
│ elif 标题含关键词 → ✅ 收录 │
|
||||
│ elif 摘要含 ≥2 个关键词 → ✅ 收录 │
|
||||
│ else → ❌ 丢弃 │
|
||||
│ │
|
||||
│ 过滤结果:日均 ~5000 条总记录 → 约 400-800 条肿瘤相关 │
|
||||
│ 预计耗时:1-2 分钟 │
|
||||
|
||||
Reference in New Issue
Block a user