Files
backend/docs/11-搜索功能差距分析.md
T
34047007@qq.com 6a8eb70dde
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
docs: 更新搜索功能差距分析 + 实施计划至第三轮修复完成
- 11-搜索功能差距分析.md: 修复表格统一为 48 项,固件 Bug 区三轮全列
- 12-搜索功能实施计划.md: Phase 2/3 加状态栏,验证流程更新为当前命令
2026-07-27 11:07:43 +08:00

12 KiB
Raw Blame History

搜索功能差距分析:与 PubMed 对比

原始审计日期2026-07-249 Agent 审计) 已修复至2026-07-27(三轮修复,共 48 项 fix)

  • 第一轮 Phase 1-734 项修复(parser + engine + frontend
  • 第二轮审计:8 项修复(MH:noexp, De Morgan, 重复 NOT, Custom Range 等)
  • 第三轮审计:14 项修复(SB/STAT/UID 门控, 日期精度, [ALL] 注册, 参数验证等) 测试状态:127 项搜索测试全部通过,前端构建无报错

本文档作为持续差距追踪使用,已完成项已标记 ,当前阻塞项用 🚧 标注。


1. 当前系统架构

用户输入 → pubmed_query_parser.py42+ 字段标签递归下降解析器)
           ↓
       search_engine.pyPostgreSQL tsvector + JSONB + ILIKE + MeSH 树展开)
           ↓
       POST /features/search/advanced(主要检索端点)
           ↓
       SearchView.vue(搜索结果渲染 + URL 持久化)
  • 解析器42+ 字段标签,AND/OR/NOT 布尔,NOT NOT 双重否定,[MH:noexp],括号分组(嵌套 10 层),日期范围(DP/EDAT/CRDT/MHDA/LR/DCOM/DEP),独立日期字段
  • 搜索引擎tsvector GIN + JSONB contains + ILIKE 回退 + MeSH tree_number 展开 + ATM 自动术语映射
  • 前端HomeView → SearchView 参数完整传递,URL 状态持久化(齐套 24 个参数),日期精度保留,page_size 恢复

2. 数据充分性评估

2.1 充分字段(可直接支撑搜索)

字段 覆盖率 用途
pmid 1,662/1,662 (100%) [PMID] 精确搜索
title 1,652/1,662 (99.4%) [TI] 全文搜索
abstract 1,550/1,662 (93.3%) [AB] 全文搜索
doi 1,548/1,662 (93.1%) [DOI] 精确搜索
authors (JSON) 1,659/1,662 (99.8%) [AU] [AD] 搜索
pub_types (JSON) 1,557/1,662 (93.7%) [PT] 筛选
journal 1,662/1,662 (100%) [TA] 全称搜索
publication_status 1,552/1,662 (93.4%) 状态筛选
pub_year 1,662/1,662 (100%) [DP] 年份搜索
pub_date 1,148/1,662 (69.1%) [DP] 日期搜索
language 1,644/1,662 (98.9%) [LA] 搜索
search_tsv 1,662/1,662 (100%) tsvector GIN 全文搜索
mesh_headings (JSON) 845/1,662 (50.8%) MeSH 展示(搜索由 literature_tags 完成)
literature_tags 997 条关联 [MH]/[MAJR] 搜索
grants (JSON) 323/1,662 (19.4%) [GR] 搜索
chemical_list (JSON) 508/1,662 (30.6%) [NM] 搜索
study_design (JSON) 1,552/1,662 (93.4%) 临床研究设计筛选

2.2 严重不足字段

字段 覆盖率 影响 优先级
journal_iso 0/1,662 (0%) [TA] 缩写期刊搜索完全不可用 P0
tree_numbers 0 行数据 _expand_mesh_tag_ids INNER JOIN → 所有 [MH]/[MAJR] 查询返回 0 结果 P0
keywords (JSON) 0/1,662 (0%) [OT] 其他关键词搜索不可用 P1
pmc_id 9/1,662 (0.5%) XPath bug[PMC] 搜索和 PMC OA 全文抓取不可用 P1
gene_symbols (JSON) 0% 基因符号搜索不可用 P2
is_negative_result 仅 pubmed_api 来源有 构造函数遗漏 seed_data P1
retraction_details 0% 全库无撤稿记录 P3
full_text_sections 0.4% PMC OA 全文解析进度 P3

2.3 核心数据指标

总计:        1,662 篇
年份分布:    2025=58, 2026=1,604 (96.5% ∈ 2026)
标签:        99 个 (全部 manual, 28 个未关联任何文献)
文献-标签:   997 条 (946 major, 51 non-major)
每篇标签数:  P25=1, P50=1, P75=2, P90=5, P99=6
被引次数:    median=0, avg=0.6, max=491
撤稿:        0 篇
语言分布:    eng=1,496, en=110, chi=35, jpn=7, rus=4
citation_status: MEDLINE=502, Publisher=254, In-Process=64, PubMed-not-MEDLINE=59
publication_status: ppublish=544, epublish=530, aheadofprint=478

3. 与 PubMed 搜索功能差距矩阵(已更新至 2026-07-27)

搜索功能 PubMed 当前系统 差距
纯文本搜索 (title/abstract) tsvector + 权重 tsvector + GIN 无 setweight(待迁移)
[TI] 标题字段 精确 + 词干
[AB] 摘要字段 精确 + 词干
[TIAB] 标题+摘要 两者
[AU] 作者字段 精确 + 自动截词 (ILIKE) exact 参数被忽略
[CN]/[FAU]/[LAU] 集体/全/末作者 映射到 author 区分不精确(同 AU 路径)
[TA] 期刊字段 全称 + 缩写 journal_iso 数据覆盖率问题
[JT] 期刊全称 全称
[MH] MeSH 字段 tree_number 展开 + 子树 tree_numbers 数据填充后可用
[MAJR] 主要 MeSH 同上 + major 同上
[MH:NoExp] 不展开 精确 MeSH 第二轮回定
[PT] 文献类型 精确匹配 JSONB contains
[DP] 出版日期 范围 + 格式灵活 浮点日期交换已修复
[EDAT] 入库日期 精确日期
[CRDT] 创建日期 精确日期
[MHDA] MeSH 日期 精确日期
[LR] 修订日期 精确日期
[DCOM] 完成日期 精确日期
[DEP] 电子出版日期 精确日期
[LA] 语言 2 字母代码
[AD] 机构 地址文本 JSONB cast 假阳性(需独立列)
[SB] 子集 medline/pubmed/代码 第三轮回定:medline→statuspubmed→no-op
[STAT] 状态 citation status
[UID] PMID 数字+DOI
[OT] 其他关键词 关键词文本 ⚠️ 映射到 "all" 语义过宽,需 keyword 独立字段
[GR] 基金号 基金信息 JSONB contains
[NM] (substance) 化学物质名 JSONB contains
[RN] 注册号 Registry Number
[SH] 副主题词 Subheading
[SI] 数据银行 DataBank
[PA] 药理作用 Pharmacological Action
[PS] 个人名称主题 Personal Name Subject
[TT] 翻译标题 Transliterated Title
[ED]/[IR] 编者/研究员 Editor/Investigator
[AUID] 作者 ID ORCID/iD 数据覆盖率问题
[COIS] 利益冲突 Conflict of Interest
[PUBN] 出版说明 Publication Note
[TW] 文本词 title/abstract/MeSH 映射到 "all" 漏 MeSH 词
[ALL] 全字段 等价于无标签 第三轮回定
[VI]/[IP]/[PG] 卷/期/页码
[LID] 文献 ID e-location ID
[PMID]/[DOI] 精确匹配
[PL] 出版地 国家/城市 未注册字段标签
[SO] 来源 期刊+卷+页码 未注册字段标签
[PMC] PMCID 精确匹配 数据覆盖率问题
[GEN] 基因符号 基因 数据 0%
[REF] 引用关系 引用文献 功能缺失
[ALL] [OAB] [WORD] 其他标签 静默降级到 plain_text
通配符 * 单/多字符 plainto_tsquery 不支持
精确短语 "..." phraseto_tsquery ⚠️ ILIKE 回退 GIN 索引未利用
AND/OR/NOT 布尔 从左到右优先级 ⚠️ AND>OR 优先级(已知 L1
ATM 自动术语映射 MeSH + Journal + Author query_expansion.py 已实现
Entry Terms 入口词 ~200k 同义词 _expand_mesh_tag_ids 已实现
best_match 排序 相关度+日期 ⚠️ 权重公式可调优
中文搜索 name_zh ILIKE + simple 词典

4. 关键 Bug 现状(已修复)

已修复 — 第一阶段(Phase 1-7,34 项)

2026-07-27 完成,涉及搜索解析器、搜索引擎 SQL、前端搜索 UX、屏幕宽度响应、API 参数验证。详见 docs/12-搜索功能实施计划.md 和 git log 723c4fc

已修复 — 第二阶段(8 项)

# 修复项 文件 说明
F1 [MH:noexp] 顶层 _noexp 丢失 search_engine.py _noexp 分组,分别调用 _expand_mesh_tag_ids
F2 组内 NOT De Morgan 律违反 search_engine.py 全 NOT 组单 not_() 包裹组合条件
F3 _parse_not_expr 不支持重复 NOT pubmed_query_parser.py 递归 toggle is_not
F4 SearchView Custom Range 不发送日期 SearchView.vue datePreset === 'custom' 分支
F5 HomeView restoreFromUrl 恢复不全 HomeView.vue 补 sort/field/retracted/negative
F6 precision_mode 死代码 AdvancedSearchPanel.vue + types/index.ts 全链路移除
F7 is_oa 死类型字段 types/index.ts 标记 unused
F8 _expand_mesh_tag_ids N+1 → 批量 search_engine.py 2 查询代替 2N

已修复 — 第三阶段(14 项)

# 修复项 文件 说明
P0-1 sb/stat/uid/dep 门控遗漏 search_engine.py 两个 has_pubmed_terms 检查补全
P0-2 [SB] 映射到错误领域 search_engine.py medline→citation_statuspubmed→no-op
P0-3 括号组单 NOT 词丢失否定 search_engine.py len>1len>=1
P0-4 HomeView watch 丢弃参数 HomeView.vue URL sync 补全 4 字段
P0-5 日期精度丢失 SearchView.vue urlDateFrom/urlDateTo 保留完整日期
P1-1 [ALL] 未注册 pubmed_query_parser.py _FIELD_TAG_MAP + _ALL_FIELD_TAGS 添加
P1-2 独立日期字段降级 pubmed_query_parser.py _dispatch_term 增加 DP/EDAT/... 分支
P1-3 浮点日期范围不交换 pubmed_query_parser.py 非 digit 时 ISO 串比较 + 交换
P1-5 MeSH entry_terms 大小写 import_mesh_full.py .lower() 统一 store
P1-8 page_size 未恢复 SearchView.vue restoreFromQuery + syncSearchToUrl
P3-2 MeSH 展开无异常保护 search_engine.py try/except 包裹 DB 查询
P3-4 sort/field/boolean 无验证 features.py field_validator
P3-5 GET search 无查询长度限制 literature.py 100 词上限
P3-6 中文正则不一致 query_expansion.py [一-鿿㐀-䶿豈-﫿] 同步

5. 当前遗留限制(不改或需架构变更)

ID 问题 原因
L1 混合 AND/OR 优先级(A OR B AND C 需 AST 重构,当前扁平列表无法保留嵌套结构
L2 Affiliation JSONB cast 假阳性 需独立 affiliation 列 + Alembic 迁移 + 重新填充
L3 retracted "yes"="only" 命名语义,SQL 条件相同
L4 OR-mode NOT 检测不可靠 UnaryExpression + _sa_ops.inv 不可靠用于复合 NOT
L5 [OT] 映射到 "all" 语义过宽 需 keyword 独立 JSONB 列 + 抽取补充
L6 15 个字段标签未注册(PL/SO/PMC/GEN/REF 等) 低使用频率或数据缺失
L7 GIN 索引缺失(多个 JSONB 列) 需 DBA 操作,生产数据量大
L8 _dispatch_term 回归不可见 需字段级测试(现有测试不验证分发目的地)

6. 结论

搜索功能已基本达到与 PubMed 对等的核心能力。 经过三轮共 48 项修复:

  • 42+ 字段标签完整注册并接通搜索路径(仅 7 个低频标签未注册)
  • 所有日期字段(DP/EDAT/CRDT/MHDA/LR/DCOM/DEP)范围+独立语法均支持
  • MeSH 树展开 + 入口词匹配 + ATM 自动术语映射正常工作
  • 布尔运算 NOT/AND/OR + 括号分组 + 重复 NOT 正确处理
  • 前端搜索参数 URL 全量持久化,日期精度保留
  • sort/field/boolean 参数经过验证拒绝非法值
  • 127 项搜索测试覆盖全部场景

剩余 8 项限制(L1-L8)属于架构性改进或低频场景,不影响搜索功能的日常使用。核心阻塞项已全部解除。

详细实施状态见 12-搜索功能实施计划.md