diff --git a/docs/13-搜索修复全记录.md b/docs/13-搜索修复全记录.md index d6c317b..257eaca 100644 --- a/docs/13-搜索修复全记录.md +++ b/docs/13-搜索修复全记录.md @@ -2,7 +2,7 @@ > 本文档按修复轮次详细记录所有搜索功能合规性修复的背景、根因分析和修改内容。 > -> **累计**:7 轮,95 项修复,50+ 字段标签注册,276 项测试覆盖 +> **累计**:7 轮,97 项修复,50+ 字段标签注册,276 项测试覆盖 > **时间跨度**:2026-07-24 ~ 2026-07-27 > **核心文件**:`pubmed_query_parser.py`(~730 行)→ `search_engine.py`(~1320 行) @@ -619,6 +619,20 @@ - **问题**:解析器 `.upper()` 产生 `"TITLE/ABSTRACT"` 但 map 只有 `"Title/Abstract"` - **修复**:增加大写键 +### P7-21: PubMed 路径中文 tsquery 降级(D2) + +- **文件**:`search_engine.py` `_field_condition("all")` L1198 +- **问题**:PubMed 路径对无标签中文词(如 `肺癌` 在 `lung cancer OR 肺癌` 中)使用 `plainto_tsquery("english", 肺癌)` → tsvector 是英语配置 → 返回空 → 零结果。仅当 `[TI]`/`[AB]` 加字段标签或有通配符时才走 ILIKE +- **根因**:tsquery("english") 不索引中文字符 +- **修复**:`_field_condition("all")` 默认路径新增中文检测 → ILIKE title/abstract 回退 + +### P7-22: 裸混合布尔 A OR B AND C 保留 AND 分组(D3) + +- **文件**:`pubmed_query_parser.py` `_parse_or_expr()` L475 +- **问题**:`A OR B AND C` 被拉平为 3 个 term OR:`A OR B OR C`。PubMed 语义应是 `A OR (B AND C)` +- **根因**:`_parse_or_expr` 对 `left`/`right` 做 `extend`,AND cluster 全部拉平 +- **修复**:收集各 `_parse_and_expr` 结果为独立 cluster,OR 存在时将 >1 term 的 cluster 包装为 group + `group_operators="and"`。引擎 OR 模式将 groups 互相 OR,组内 AND + --- ## 遗留限制