Commit Graph
17 Commits
Author SHA1 Message Date
34047007@qq.com 2b6ffd6de4 fix: 第19轮搜索审计修复 — NOT组语义/公共搜索/AND聚类等10项
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
- Bug-R19-1 (HIGH): NOT (A OR B)与(NOT A OR NOT B)结构一致 → group_negated
- Bug-R19-2 (MEDIUM): 日期swap year:full_date边界过宽 → year branch恢复>
- Bug-R19-3 (MEDIUM): group_negated长度与groups不匹配 → 补append(False)
- Bug-R19-4 (LOW): 括号内AND聚类丢失 → 移除_depth>0守卫
- Bug-R19-5 (MEDIUM): 混合大小写引号短语丢失exact标记 → term.lower()
- Bug-R19-6 (HIGH): 公共搜索完全不可用 → 移除get_current_user依赖
- Bug-R19-7 (MEDIUM): message.warning()副作用在Vue computed中 → 移除
- Bug-R19-8 (MEDIUM): 搜索错误信息不区分状态码 → 401/400/429/500
- Bug-R19-9 (HIGH): R18 text重命名遗留未引用 → _term_text完全化
2026-07-28 16:11:19 +08:00
34047007@qq.com de1f4a4bb8 fix: 第16轮搜索审计修复 — all_not/group_negated分离 + _parse_primary重复组 + 错误显示
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
- Bug 2 (MEDIUM): all_not 混淆外部NOT与内部NOT,新增 group_negated
  字段区分,_pubmed_conditions 改用 pp.group_negated[idx] 替代 all_not
- Bug 1 (MEDIUM): _parse_primary 括号组内重复group赋值,只处理
  group_id < 0 的未分配terms,_parse_or_expr 增加 depth>0 守卫
- Bug 3 (MEDIUM): SearchView.vue 搜索错误显示为"no results",
  新增 searchError ref + NResult 错误面板
- Bug 4 (LOW): literature.py UUID类型转换优化
2026-07-28 14:08:46 +08:00
34047007@qq.com 6f861c8543 fix: 第12轮搜索审计修复 — _normalize_field_label 崩溃/keyset NULLSLAT/共享列表变异等21项修复
P0 (3): _normalize_field_label 函数缺失导致 (a OR b)[TI] 崩溃;
      共享列表变异污染 result.groups;POST /search/advanced 缺少用户认证
P1 (8): has_not 忽略括号内 NOT;紧凑日期 YYYYMMDD 未归一化;
      日期字段非日期文本 SQL 错误;keyset NULLSLAT ~50% 空值行跳过;
      first_author 非 dict JSON 崩溃;MeSH 无匹配静默丢弃;
      相关性排序含否定词;词数检查在 PubMed 清洗之前;
      普通搜索缺错误处理;#N 引号感知不完整
P2 (6): 月越界退化;MH/MAJR FALSE 语义;field 白名单缺字段;
      retracted/negative_result/tag_ids 验证器;resolveQuery 重复调用;
      SearchRequestBody.page 可选;restoreFromQuery showCustomYear
2026-07-28 12:38:17 +08:00
34047007@qq.com 090938fa2b fix: 第11轮深度审计修复 — P0 keyset翻页崩溃 + P1布尔符语义/语法误报等16项修复
P0 (1项):
- keyset cursor: lit.title or "__NULL__" 空字符串误判为NULL导致后续翻页全空

P1 (6项):
- boolean_operator: 仅扫描depth=0的token,括号内AND/OR不再影响顶层操作符判定
- is_pubmed_syntax: 去除AND/OR/NOT检测的IGNORECASE(PubMed仅识别大写布尔符)
- _relevance_query: MeSH-only查询(如breast[MAJR])补充原始回退,避免退化到日期排序
- pmid_terms: 缺少try/except int(),补充ValueError+DOI兜底
- 部分日期展开: 2024-01[DP]等YYYY-MM partial date展开为整月范围(DP/EDAT/CRDT)
- 前端#N去重: resolveQuery/expandQuery dedup refs防重复引用误判为循环

P2 (9项):
- cache: filter-options加入invalidate_search_cache清理
- worker: daily_ftp_update/daily_citation_update异常时finally保证缓存清理
- cursor_val: 空字符串''通过is None检查,补充not cursor_val
- keyset UI: 模板条件sort==='date'改为KEYSET_SORTS.has(sort)
- resetAllFilters: 补充showCustomYear=false
2026-07-28 12:08:17 +08:00
34047007@qq.com a985d07724 fix: 第10轮搜索审计修复 — 缓存键PubMed标志、NOT OR语义、affiliation ILIKE、前端布尔OR切换和精确短语
- 后端: _search_cache_key和_facet_cache_key加入"pm": _is_pm(query)防止PubMed/纯文本路径缓存碰撞
- 后端: OR模式下neg_conds不再AND到所有条件,改用or_(*term_conditions)直接组合
- 后端: _field_condition("all")所有5条分支添加affiliation ILIKE通过jsonb_array_elements(authors)子查询
- 后端: AdvancedSearchRequest.query添加max_length=2000
- 前端: SearchView搜索栏添加AND/OR切换器和精确短语复选框
- 前端: exact_phrase参数从SearchView传递到API请求
- 前端: booleanOp和exactPhrase同步到URL并可从URL恢复
2026-07-28 11:41:08 +08:00
34047007@qq.com 73f9468384 fix: 第8轮搜索深度审计修复 — 缓存失效、Redis重试、中文标签、翻页稳定性等12项
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CRITICAL:
- invalidate_search_cache 清理 atm:* 缓存(MeSH ATM扩展不再用过期结果)
- Pro 方案 api_quota_per_day 1000→10000(修复低于 Free 的数据错误)
- CacheService/RateLimitMiddleware Redis 连接失败60秒自动重试(原永久降级)
- 普通搜索中文输入自动匹配 GlobalTag.name_zh(如"肺癌"通过MeSH标签关联文献)
- AdvancedPubSearchView resolveQuery 添加 seen Set 检测交替 #N 循环引用

HIGH:
- 限速器 _burst_windows 每500请求清理过期条目(防止内存泄漏)
- cron daily_ftp_update 末尾调用 invalidate_search_cache()(自动管道不再用过期缓存)

MEDIUM:
- _apply_order_by ASC 排序加 id tiebreaker(title/journal/first_author翻页跳行/重复)
- _keyset_condition 所有 is_(None) 加 id tiebreaker + __NULL__ 哨兵值
- _field_condition("all") 默认tsvector路径加 journal/journal_iso ILIKE 兜底
- SearchView restoreFromQuery date_preset/year_from/year_to 优先顺序修复

docs: 更新 12/13 搜索文档,移除 CLAUDE.md 陈旧 SQLite 提及
2026-07-28 11:02:29 +08:00
34047007@qq.com 4f6024aa7a fix: 搜索模块审计修复 — ATM+NOT、affiliation、分页、SB 等 12 项漏洞
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
2026-07-27 16:57:13 +08:00
34047007@qq.com 388cbaaa95 refactor: 前端 keyset 分页推广 + cursor_date→cursor_val 统一
- AdvancedSearchRequest.cursor_date → cursor_val(通用游标值字段)
- SearchView 移除 sort===date 守卫,所有排序模式统一使用 keyset
- HomeView 游标字段同步更新
- 类型定义同步
2026-07-27 16:16:35 +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 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 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 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