docs: 记录 D2/D3 修复(P7-21/P7-22)
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s

This commit is contained in:
34047007@qq.com
2026-07-27 14:23:34 +08:00
parent 8a4826220a
commit 2d76e8afe2
+15 -1
View File
@@ -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` 结果为独立 clusterOR 存在时将 >1 term 的 cluster 包装为 group + `group_operators="and"`。引擎 OR 模式将 groups 互相 OR,组内 AND
---
## 遗留限制