Commit Graph
28 Commits
Author SHA1 Message Date
34047007@qq.com 0895359b6f perf: 搜索引擎优化 — 五重缓存 + Keyset 全排序 + tag_ids 筛选
- ATM 展开缓存(atm:{md5}, 3600s TTL)
- 期刊 map 全表缓存(journals:map, 3600s TTL)
- 搜索结果精简缓存(search:{md5},不含 tags/journal 纯数据)
- 分面 year_counts 独立缓存(search:year_counts:{md5},首页用)
- 标签筛选改为 tag_ids && ARRAY[uids] GIN 索引扫描,免 JOIN
- Keyset 分页推广至 date/cited/title/journal/first_author 全部排序模式
- _keyset_condition() + _cursor_from_item() + _hydrate_items() 通用化
- COUNT 仅首页执行,结果缓存到分面键
2026-07-27 16:16:26 +08:00
34047007@qq.com 0b2bd87d61 perf: 标签二级缓存 + cache.mget 批量读取
- tag_loader 增加 Redis L2 缓存(tags:{lit_id}, 86400s TTL),批量 mget
- cache.py 新增 mget() 方法,同键 Redis 批量查询 + memory 降级
- tag_service.py 打标后自动清除对应缓存
2026-07-27 16:16:21 +08:00
34047007@qq.com c791c06096 fix: FTP pipeline MeSH 打标链 — 修复 _upsert_article_impl 缺少 tag_article() 调用
FTP 增量更新写入 mesh_headings JSONB 后未调用 tag_article(),导致
GlobalLiteratureTag 无关联记录,[MH]/[MAJR] 搜索返回空。新增 tag_ids
数组维护 + 标签缓存失效。
2026-07-27 16:16:17 +08:00
34047007@qq.com 91748bf668 docs: D6 [SH]/[MAJR] 标注为已知限制L6(依赖MeSH抽取质量),移除已修复的L1(混合布尔)
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
2026-07-27 15:19:39 +08:00
34047007@qq.com fe7461e81a docs: 补充 D5 #N 历史引用设计决策说明
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
2026-07-27 15:18:36 +08:00
34047007@qq.com 5a3e5c03cd docs: 记录 P7-23 混合布尔引擎分支修复
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
2026-07-27 15:15:36 +08:00
34047007@qq.com 2169308e67 fix: 混合布尔丢失 OR — boolean_operator="mixed" 引擎分支修复
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
boolean_operator 有三种值:and/or/mixed。引擎只处理了 "or",
"mixed" 落到了 else(AND),导致 A OR B AND C 中 OR 完全丢失。

修复两处:
- field_combine: 用 or_ 当 string(mixed) 场景,因为各组内是 OR 关系
- term_conditions 合并: mixed 与 or 同逻辑,OR 合并所有正条件
2026-07-27 15:15:15 +08:00
34047007@qq.com 5b9fcff82e chore: 新增 MeSH Major Topic 数据完整性审计脚本
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
- 随机抽样 1000 篇有 mesh_headings 的文献
- 将 JSONB 中的 major=true 与 global_literature_tag.is_major 交叉验证
- 报告漏标率(false negative)和误标率(false positive)

运行结果(sample=1000):
  漏标率:0.1%  误标率:0.0%
  Major Topic 数据质量良好,无需修复 pipeline
2026-07-27 15:03:56 +08:00
34047007@qq.com 8bb0ff2cd0 fix: D4 统一 MEDLINE 筛选与计数来源 — 改用 journal.nlm_subsets
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
之前:medline_only 用 citation_status='MEDLINE'(文章级)
      筛选面板计数用 journal.nlm_subsets @> ARRAY['M'](期刊级)
      两者不一致 → in-process 文章计入面板但筛不到
现在:统一使用 journal.nlm_subsets 来源,与 nlm_subsets 参数复用相同机制
2026-07-27 14:52:52 +08:00
34047007@qq.com 2d76e8afe2 docs: 记录 D2/D3 修复(P7-21/P7-22)
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
2026-07-27 14:23:34 +08:00
34047007@qq.com 8a4826220a fix: D2 中文搜索 + D3 混合布尔语义 — PubMed 搜索路径修复
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
D2: PubMed 路径搜索中文(不带字段标签)时,plainto_tsquery("english")
    对中文返回空,导致零结果。新增 ILIKE fallback 检测中文字符。
D3: A OR B AND C 被解析器拉平为 A OR B OR C。修改 _parse_or_expr
    保留 AND cluster 分组,引擎正确产生产出 A OR (B AND C)。
2026-07-27 14:23:10 +08:00
34047007@qq.com c1e38386f8 fix: 移除前端 BOOK/FILTER/ISBN 字段选择项(后端不支持,静默降级为全文搜索)
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
- BOOK/FILTER/ISBN 不在 parser._ALL_FIELD_TAGS 中
- tokenizer 将其降级为普通 WORD,字段约束完全丢失
- 用户选择这些字段时搜索结果被静默降级为全文搜索,造成误导
- 从 _FIELD_LABEL_MAP、_VALID_TAGS、fieldOptions 三处移除
2026-07-27 13:36:28 +08:00
34047007@qq.com 62be0efb59 fix: 第七轮深度搜索审计修复 — 20项
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
- HIGH: isdecimal() → re.match() for PMID (non-ASCII digit crash)
- HIGH: boolean_operator 应用到字段分组和无标签词(AND/OR 错误)
- HIGH: Cursor 分页 pub_date 优先(article_date 导致数据错位)
- Parser: parse 异常处理器清理字段标签/布尔符/引号
- Parser: _parse_range date:year 反向交换(第4分支)
- Parser: MAX_TERMS 保护、TITLE/ABSTRACT 大写键补充
- Engine: best_match 排序剥离字段标签
- Engine: year_from/year_to is not None(年份=0 被 falsy 跳过)
- Engine: _single_term_condition SB 字段全量分发
- Engine: journal_tiers/nlm_subsets 空条件预警(0结果保障)
- Engine: ATM 展开和 _expand_mesh_tag_ids pass → logger.exception
- Engine: 降级 regex [\w/: -] 兼容 [MH:noexp] 冒号
- Frontend: syncSearchToUrl 移到 finally 块
- Frontend: 年份滑块/resetAllFilters 清除 URL 日期
- Frontend: Null cursor 日期安全守卫
- Docs: 新增 P7-1~P7-20 记录,测试数更新至 276
2026-07-27 13:01:52 +08:00
34047007@qq.com 4495ef9e0a fix: 第六轮全面搜索审计修复 — 12项
Parser: Title/Abstract大小写匹配、末尾OR空Term保护、tokeniser gap字符恢复、
混合日期范围反转支持
Engine: field标签正则含/、ATM括号剥离、name_zh LIMIT 100、
year_from/ year_to is not null检查
Docs: 更新修复全记录至第六轮
2026-07-27 12:47:09 +08:00
34047007@qq.com 7032accd31 docs: 更新第五轮修复记录提交哈希
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
2026-07-27 11:55:21 +08:00
34047007@qq.com 275a9f6511 fix: 第五轮PubMed搜索审计 — 4项边缘案例修复 + 第5轮审计文档
Parser边缘案例修复:
- P5-1: 尾部NOT导致IndexError降级(_parse_not_expr添加EOF守卫)
- P5-2: 单数字日期格式不被识别(YYYY-M-D→YYYY-MM-DD归一化)
- P5-3: is_pubmed_syntax不处理全角字符(增加NFKC归一化)
- P5-4: extract_pubmed_query_for_prisma不能处理[Title/Article]

同时将在前几轮修复的F1-F8([MH:noexp]顶层支持、NOT De Morgan、
NOT NOT递归、Custom Range日期、HomeView恢复、precision_mode清理、
is_oa注释、N+1批量优化)补充文档核对验证。
2026-07-27 11:55:03 +08:00
34047007@qq.com 2979de6f9c docs: 新增搜索修复全记录文档(13-搜索修复全记录.md)
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
涵盖 4 轮 59 项修复的详细背景、根因分析、修改内容和变更文件,
按轮次分别记录 Phase 0-7、第二轮(8项)、第三轮(14项)、第四轮(11项)。
2026-07-27 11:22:22 +08:00
34047007@qq.com 807972d41b feat: 第四轮PubMed搜索字段补全 — 11项修复
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
- [Title/Abstract]/[OAB]/[WORD]/[FI]/[SO]/[PL] 注册
- [GEN] 基因符号搜索 → gene_symbols JSONB
- [PMC] PMCID 搜索 → pmc_id 列
- [OT] 语义修复 → keywords JSONB(不再映射到 all)
- phraseto_tsquery 精确短语(GIN 索引替代 ILIKE)
- has_pubmed_terms 门控补全新字段
- 127 项搜索测试全部通过,前端构建无报错
2026-07-27 11:19:10 +08:00
34047007@qq.com 6a8eb70dde docs: 更新搜索功能差距分析 + 实施计划至第三轮修复完成
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
- 11-搜索功能差距分析.md: 修复表格统一为 48 项,固件 Bug 区三轮全列
- 12-搜索功能实施计划.md: Phase 2/3 加状态栏,验证流程更新为当前命令
2026-07-27 11:07:43 +08:00
34047007@qq.com a37cc506fc fix: 第三轮PubMed搜索审计 — 14项修复(P0×5, P1×4, P3×5)
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
P0 (搜索结果错误):
- 门控补全 sb/stat/uid_terms + dep_from/dep_to
- [SB] 映射修复: medline→citation_status, pubmed→no-op
- 括号组内单否定词丢失 not_() 修复
- HomeView URL watch 补全 sort/field/retracted/negative
- HomeView→SearchView 日期精度保留(urlDateFrom/urlDateTo)

P1 (功能缺陷):
- [ALL] 字段标签注册(_FIELD_TAG_MAP + _ALL_FIELD_TAGS)
- 独立日期字段 "2024-01-01"[DP] 降级修复(_dispatch_term)
- 浮点日期范围交换(2026-01-01:2024-01-01 → 自动排序)
- page_size URL 恢复 + syncSearchToUrl 输出

P3 (健壮性):
- MeSH 展开 try/catch(expand_atm + _expand_mesh_tag_ids)
- sort/field/boolean 参数验证(field_validator)
- GET /search 查询长度限制(100词)
- query_expansion.py 中文正则同步 [一-鿿㐀-䶿豈-﫿]
- import_mesh_full entry_terms 统一小写(匹配 JSONB @> 精确比较)

测试: 127/127 搜索测试通过,前端构建无报错
2026-07-27 11:02:22 +08:00
34047007@qq.com e688241355 fix: 第二轮PubMed搜索合规审计 — 8项修复 + 6项新测试
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
F1: search_engine.py `_pubmed_conditions` 顶层 [MH:noexp] 丢失 _noexp 标志
    按 _noexp 分组 mesh_terms,分别调用 _expand_mesh_tag_ids(noexp=True/False)

F2: search_engine.py 组内 NOT 违反 De Morgan 律
    全组 is_not=True 时单 NOT 包裹组合条件而非 per-term not_()

F3: pubmed_query_parser.py `_parse_not_expr` 不支持重复 NOT
    改为递归调用,NOT NOT toggle is_not(三重 NOT 正确)

F4: SearchView.vue Custom Range datePreset 不发送日期参数
    增加 datePreset === 'custom' 分支发送 year_from/year_to

F5: HomeView.vue restoreFromUrl 恢复不全
    补全 sort/field/retracted/negative_result

F6: AdvancedSearchPanel.vue precision_mode 死控件移除(UI+emit+reset)
    types/index.ts precision_mode 死类型字段移除

F7: types/index.ts is_oa 标记为 unused, reserved

F8: search_engine.py `_expand_mesh_tag_ids` N+1 → 2 批量查询
    所有 entry_terms 和 name_en 分别合并为 OR 查询

测试: 新增 NOT NOT/triple NOT/NOT group/DM:noexp 顶层 共 7 项
2026-07-27 10:30:40 +08:00
34047007@qq.com 723c4fc5c9 fix: PubMed搜索合规 — 34项修复 + query_expansion UnboundLocalError + HomeView precision_mode残留
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
Batch1 — 解析器 (pubmed_query_parser.py)
- P0-1: 未知字段标签降级为 WORD token 而非 ParseError
- P2-1: 增加未消费 token 检查
- P2-2: PRISMA 字段标签正则 [\w:+] → [\w:]+
- P2-3: Unicode NFKC 规格化输入
- P2-4: re.ASCII 防止 Unicode 数字匹配
- P2-9: 移除重复 dataclass 字段

Batch2 — 搜索引擎 (search_engine.py)
- P1-1: 批量 PMID 查询替代 N+1 循环
- P1-2: isdigit() → isdecimal()
- P1-5: 移除 precision_mode 参数
- P2-5: 移除死代码
- P2-6: 统一 _CHINESE_RE 正则

Batch3 — ATM 引擎 (query_expansion.py)
- P0-4: name_zh ILIKE 中文回退 + _find_mesh_tags 中文降级
- P1-3: name_en ILIKE 加 LIMIT 100

Batch4 — API 层 (features.py)
- P1-5: 移除 precision_mode 请求字段
- P1-11: 增加 logging
- P2-8: NLM_SUBSET_LABELS f-string 安全注释
- P2-12: split 校验器近似性注释

Batch5 — SearchView.vue
- P0-5a/b/c: 日期修复(UTC 方法、互斥逻辑、restoreFromQuery 合并)
- P2-10: 筛选模态关闭时重搜
- P3-1: 搜索框 aria-label

Batch6 — HomeView.vue
- P1-10: URL date → date_from/date_to
- P2-11: clearSearch 清空 feedItems 并重加载

Batch7 — LiteratureCard.vue
- P1-6: 字段标签正则 [\w-]+ → [\w:-]+
- P1-7: terms 切片限制 20 项防 ReDoS

后修复:
- query_expansion.py _find_partial_mesh_tags UnboundLocalError(单非中文词未初始化 tag_ids)
- HomeView.vue handleAdvancedSearch precision_mode 残留引用
2026-07-27 09:45:17 +08:00
34047007@qq.com 43392438c8 新增全面验证测试 + 验证报告(102 测试全部通过)
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
- test_comprehensive_verify.py (39 tests): 覆盖 Group A 解析器缺口
  (纯文本引号/通配符/数字、MH:noexp/MESH/SB/STAT/UID/JT/PA 字段标签、
  EDAT/DEP 日期范围、NOT 日期、双层括号、布尔优先级、混合查询、
  >100 token 降级、NOT 各字段)
- VERIFICATION_REPORT.md: 所有 P0-P4 17 项修复确认 ,5 项 ⚠️ 已知残留
2026-07-27 09:12:46 +08:00
34047007@qq.com 5f69277eba feat: PubMed搜索合规审计 Phase 5-7 全部修复
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
P1-2: [SB][STAT][UID][DEP][MESH]字段支持
P1-4: [MH:noexp]解析+抑制树展开
P3: 前端date_to/P3-1、CJK高亮/P3-3、extractPlainText/P3-4、precision_mode移除/P3-6、loadMore sort/P3-5
P4-1: 词数上限50→100
P4-2: retracted参数清理
2026-07-27 09:03:19 +08:00
34047007@qq.com 62ca8fa6b8 chore: batch commit remaining changes
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
Includes search engine improvements, Alembic migrations,
new services (pubmed_daily_update, query_expansion),
frontend updates, and documentation sync.
2026-07-27 08:35:12 +08:00
34047007@qq.com 35b0a5c565 docs: add Gitea repo info to CLAUDE.md
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
2026-07-27 08:26:10 +08:00
34047007@qq.com 036494ae35 chore: add Gitea service to docker-compose, fix gitignore
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
- Gitea (postgres-backed) on ports 3000/2222
- Exclude .claude/ dir and *.db from git
- Update CLAUDE.md with Gitea remote info
2026-07-27 08:13:53 +08:00
34047007@qq.com a6cd99a4ca feat: initial commit - oncology literature search platform
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
OncoLit: a multi-tenant oncology literature search, feed, and
collaboration platform. Built with FastAPI + Vue 3 + PostgreSQL.
Includes PubMed pipeline, drug approvals, AI summaries, and
systematic review tools.
2026-07-27 07:59:18 +08:00