From 2d76e8afe25ef673684c332fb80a92468e92af63 Mon Sep 17 00:00:00 2001 From: "34047007@qq.com" <34047007@qq.com> Date: Mon, 27 Jul 2026 14:23:34 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E8=AE=B0=E5=BD=95=20D2/D3=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=EF=BC=88P7-21/P7-22=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/13-搜索修复全记录.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) 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 + --- ## 遗留限制