34047007@qq.com
|
a4d27da8ea
|
fix: 生产高级搜索 500 — 预算超时降级 + pub_date 排序索引 + affiliations_text trgm 反范式列
CI / backend (push) Waiting to run
CI / frontend (push) Waiting to run
- count/主查询独立短预算,超时降级不再 500:count 超时返回 _COUNT_CAP(10 万+)
而非 0(修复"找到 0 条结果"、分页被隐藏),主查询超时降级空结果
- 年份筛选改用 pub_date 范围,主查询 ORDER BY pub_date DESC NULLS LAST, id DESC
走新索引 ix_gl_pub_date_sort(Index Scan,替代 Parallel Seq Scan + Sort,89.5 万行 40s→<0.2s)
- affiliations_text 反规范化列 + gin_trgm 索引 + 触发器维护,替换 7 处 jsonb lateral
EXISTS(病理查询慢 ~40x);存量由 scripts/backfill_affiliations.py 分批后台回填
- ATM 门控 _has_structured_terms:结构化查询(含字段标签)的 plain 词不做 MeSH 展开,
修复 "lung neoplasms[MAJR]+年份" count 5s + main 6s 双超时(11.72s→2.02s)
- query_expansion/mesh IN(subquery) 去显式 DISTINCT(百万级 id 集合物化排序)
- alembic env 改 connect()(transaction_per_migration 每迁移独立事务,支持迁移内分批提交)
|
2026-08-10 21:48:42 +08:00 |
|
34047007@qq.com
|
ab64d2aa0a
|
fix: 搜索页 filter-options 500 — nlm_subsets @> ARRAY[...] 补 ::varchar[] cast(varchar[] vs text[] 类型不匹配)
CI / backend (push) Waiting to run
CI / frontend (push) Waiting to run
|
2026-08-10 18:06:27 +08:00 |
|
34047007@qq.com
|
7f95084d76
|
fix: 搜索 tag 过滤改用 cast(ARRAY(Uuid)),杜绝 asyncpg 把 ARRAY[$n] 推断成 text[] 导致 uuid[] && text[] 500(根因在 year_counts 子查询复用 conditions)
CI / backend (push) Waiting to run
CI / frontend (push) Waiting to run
|
2026-08-10 17:49:57 +08:00 |
|
34047007@qq.com
|
3d05f52716
|
fix: deploy.sh — 不再 set -a source 整个 .env(bash 剥引号数组导致 compose 插值取到坏 CORS_ORIGINS);auto_rollback 前释放 flock 避免回滚死锁
CI / backend (push) Waiting to run
CI / frontend (push) Waiting to run
|
2026-08-10 17:36:05 +08:00 |
|
34047007@qq.com
|
13ce116478
|
fix: deploy.sh 预检改从 .env 文件读原始值(bash source 会把 KEY=[...] 按数组解析剥引号,导致合法 JSON 误报)
CI / backend (push) Waiting to run
CI / frontend (push) Waiting to run
|
2026-08-10 17:05:05 +08:00 |
|
34047007@qq.com
|
7548a0a161
|
fix: deploy.sh 预检收窄到 CORS_ORIGINS(REDIS_URL 是 str 非复杂类型,JSON 预检会误报)
CI / backend (push) Waiting to run
CI / frontend (push) Waiting to run
|
2026-08-10 16:52:41 +08:00 |
|
34047007@qq.com
|
5842f2c99c
|
fix: deploy.sh — 回滚调用改 bash 不依赖 +x;.env 复杂类型(CORS_ORIGINS等)JSON预检 fail-fast
CI / backend (push) Waiting to run
CI / frontend (push) Waiting to run
|
2026-08-10 16:49:12 +08:00 |
|
34047007@qq.com
|
0122719d11
|
feat: deploy.sh 交互进度 — [n/11]阶段标题/长命令心跳/部署预览+y/N确认(--yes跳过)
CI / backend (push) Waiting to run
CI / frontend (push) Waiting to run
|
2026-08-10 16:42:49 +08:00 |
|
34047007@qq.com
|
c55d096769
|
feat: deploy/deploy.sh 自动化部署体系 — 双tag镜像/快照/迁移门控/回滚,退役根deploy.sh
CI / backend (push) Waiting to run
CI / frontend (push) Waiting to run
- compose 四服务补 image: ${BACKEND_TAG}/${FRONTEND_TAG} 插值(换 tag 回滚前提)
- deploy/deploy.sh:工作区校验→PREV_SHA→pull→predeploy 快照(-Fc)→destructive 判定→
build+双tag→.pending-deploy→迁移退出码门控→up -d --no-deps→健康轮询→versions.log→
镜像治理;支持 --dry-run / flock / 基础设施健康门 / 多head预检
- deploy/rollback.sh:双入口(手动读 versions.log 跳 ROLLBACK 行 / --auto 读
.pending-deploy);destructive 走 pg_restore --clean;双 tag 原子切换
- deploy/hotfix.sh:紧急单文件 cp + 强制收口提醒
- .gitignore 补 .pending-deploy/versions.log(运行时状态)
- 退役根 deploy.sh + deploy.env.example(SSH 旧模型,被 deploy/deploy.sh 取代)
|
2026-08-10 16:30:43 +08:00 |
|
34047007@qq.com
|
2c6ecc1f91
|
fix: tag_ids overlap 参数显式标注 UUID 类型,修复 uuid[] && text[] 搜索 500
CI / backend (push) Waiting to run
CI / frontend (push) Waiting to run
|
2026-08-10 16:17:36 +08:00 |
|
34047007@qq.com
|
2b7e56b9b3
|
chore: prod compose 同步 TLS/Caddy + gitea 域名(回流服务器本地改动)
CI / backend (push) Waiting to run
CI / frontend (push) Waiting to run
服务器 8-09 直接手改的 TLS/Caddy 改动从未提交 gitea,git-ify checkout
会覆盖丢失 HTTPS。回流 3 处差异:
- frontend 宿主端口 80:80 → 127.0.0.1:8080:80(8080 收紧)
- gitea 域名 123.207.9.209 → gitea.oncolit.gonsun.com
- 新增 caddy 服务(80/443 + Caddyfile 卷)+ caddy_data/caddy_config 卷
Caddyfile 加入仓库根;docs/16 记 v17 回流规则。
|
2026-08-10 07:11:08 +08:00 |
|
34047007@qq.com
|
41b83e3a64
|
fix: 批次1爆盘根因 — alembic 独立事务 + 5日期字段合并单条ALTER
CI / backend (push) Waiting to run
CI / frontend (push) Waiting to run
生产 123 万行表(9.8GB)跑批次1时磁盘满回滚(2026-08-10)。
根因二:① alembic 无 transaction_per_migration,批次1的 01+02+03 全在一个
事务,JSON→JSONB 重写空间不释放、与后续重写叠加;② 1421ea169bb6 循环逐个
ALTER 5 个日期字段 = 5 次整表重写,同一事务累积。
修复:alembic.ini 开启 transaction_per_migration(每迁移独立提交,前序空间
释放);1421ea169bb6 合并 5 列为单条 ALTER(一次重写)。
本地 DB 已在 head 不受影响,heads 仍单一头 55105f0bb1d7。
|
2026-08-10 06:06:41 +08:00 |
|
34047007@qq.com
|
3c85ded216
|
feat: 生产部署准备 — 构建加速 + 24迁移链分批脚本 + 搜索性能优化
CI / backend (push) Waiting to run
CI / frontend (push) Waiting to run
- Dockerfile 腾讯源 + BuildKit 缓存(backend pip / frontend npm ci),gitea 锁 1.27.1
- .dockerignore 纳入版本管理(防密钥进镜像)
- 新增 migrate_prod.sh:24 个迁移分 4 批执行,含镜像新鲜度 + DB 起点校验
- cb07d6b1df01 移除 search_tsv 回填(延迟到 g0h1i2j3k4l5 统一全量回填)
- 模型 journal_iso/volume/issue/pages → Text(对应迁移 95c18ebf31e4 / 55105f0bb1d7)
- 搜索优化:tsvector 主路径 + COUNT 截断(10000) + pub_date 排序,admin 聚合单查询
- statement_timeout 30s→60s
|
2026-08-10 00:33:16 +08:00 |
|
34047007@qq.com
|
0197867153
|
fix: 第31轮搜索审计修复 — 否定组日期NULL安全/多列NOT假阳性/year_counts一致性/缓存键空格等8项
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
|
2026-07-29 08:24:28 +08:00 |
|
34047007@qq.com
|
fc53a5b255
|
fix: 第30轮搜索审计修复 — 否定组NULL安全/嵌套括号_has_or/传递子组/DP标记列精度等8项
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
|
2026-07-29 07:30:36 +08:00 |
|
34047007@qq.com
|
475d6bb80c
|
fix: 第29轮搜索审计修复 — 缺失导入/中文精确短语ILIKE/子组日期标记/开区间范围/NULL安全等8项
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
|
2026-07-29 06:16:11 +08:00 |
|
34047007@qq.com
|
2b085d3445
|
fix: 第28轮搜索审计修复 — 否定范围pub_year/异常降级/YYYY-MM组内/NULL安全等8项
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
|
2026-07-29 05:33:21 +08:00 |
|
34047007@qq.com
|
d064dcd0ca
|
fix: 第27轮搜索审计修复 — 跨域日期污染/部分日期范围/标记组路径等7项
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
|
2026-07-28 22:56:04 +08:00 |
|
34047007@qq.com
|
af764237fe
|
fix: 第26轮搜索审计修复 — 部分日期/否定日期分离/混合模式NOT/7项bug
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
|
2026-07-28 20:14:05 +08:00 |
|
34047007@qq.com
|
8dd1779676
|
fix: 第25轮搜索审计修复 — _parse_range intersect/NULL安全NOT/De Morgan作用域等12项
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
R25 修复清单:
- CRITICAL: _parse_range 4个range子路径改为intersect模式(真正的H2位置)
- CRITICAL: _dispatch_term 7个日期字段恢复简单赋值(消除R24 OR回归)
- MEDIUM: 年份计数缓存污染 - _has_any_filter增加conditions检查
- MEDIUM: 13个JSONB/TEXT字段NULL安全NOT(R23-3仅覆盖3个字段)
- MEDIUM: De Morgan _handled_neg_group_date_fields跨组污染修正
- MEDIUM: DP无效日期字符串缺少else降级子句
- LOW: MESH:NOEXP字段标签支持
- LOW: is_first_page空字符串cursor_val处理
- 文档: 追加R25修复记录
|
2026-07-28 19:19:10 +08:00 |
|
34047007@qq.com
|
f8db720419
|
fix: 第24轮搜索审计修复 — 日期intersect/NOT深度/re.ASCII统一等15项
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
R24 修复清单:
- H2 (CRITICAL): _dispatch_term 7个日期字段改为intersect模式,防止单日期覆盖已设范围
- H1 (MEDIUM): 混合日期范围交换 >= → >
- BUG-1: keyset游标只使用pub_date,忽略article_date
- BUG-2: 纯*通配符返回text("FALSE")
- BUG-3: page_size上限100
- BUG-4: tag_ids上限200
- BUG-5: _escape_ilike先反转义再转义,避免双重转义
- BUG-6/7/8: _has_any_filter query.strip、数字PMID、_phrase_terms_set NameError
- M1: _parse_not_expr添加深度守卫(MAX_PAREN_DEPTH)
- M3: is_pubmed_syntax添加re.ASCII与_TOKEN_RE一致
- 前端: router.replace → push
- 文档: 追加R24修复记录
|
2026-07-28 18:42:04 +08:00 |
|
34047007@qq.com
|
c1674c602d
|
fix: 第23轮搜索审计修复 — De Morgan组内日期/空查询守卫/NULL JSONB等7项
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
- R23-1 (CRITICAL): Tokenizer尾随间隙捕获误缩进,导致全部field标签失效
- R23-2 (LOW): _parse_range字段归一化
- R23-3 (MEDIUM): YYYY-M单月日期不匹配
- R23-4 (MEDIUM): has_not未检查group_negated
- R23-5 (CRITICAL): NOT组内日期范围De Morgan错误,新增_build_date_cond_from_pp()
- R23-6 (HIGH): 空查询返回全部文献,增加text("FALSE")守卫
- R23-7 (MEDIUM): NULL JSONB/TEXT + NOT排除NULL行
1007 tests passed
|
2026-07-28 18:02:16 +08:00 |
|
34047007@qq.com
|
2444a4be2c
|
fix: 第22轮搜索审计修复 — De Morgan语义/部分日期/has_not/custom URL等8项
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
Bug-R22-1 (MEDIUM): OR模式特殊字段NOT产生错误De Morgan语义 — 17处修正
Bug-R22-2 (MEDIUM): has_not不反映日期范围NOT — 添加_date_range_markers检查
Bug-R22-3 (MEDIUM): YYYY-MM[DP]未引号部分日期无法解析 — 预处理器标准化
Bug-R22-4 (MEDIUM): date_preset=custom URL恢复丢失年份范围 — 读取URL参数
Bug-R22-5 (MEDIUM): 错误状态下分页总数残留 — 搜索开始时重置total
Bug-R22-6 (LOW): 搜索错误状态未在开始时清除 — 搜索开始时重置searchError
Bug-R22-7 (LOW): DATE token不在未消耗标记恢复处理器中 — 添加DATE类型
Bug-R22-8 (LOW): 外部NOT组内is_not被忽略 — 保留t.is_not
|
2026-07-28 17:05:27 +08:00 |
|
34047007@qq.com
|
c68aa060f0
|
fix: 第21轮搜索审计修复 — OR模式NOT回退/子组虚条目/日期OR模式等10项
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
Bug-R21-1 (CRITICAL): OR模式NOT分离过度 — A OR NOT B语义错误,恢复or_(*conditions)
Bug-R21-2 (CRITICAL): 双重嵌套括号sub_group_refs虚条目 — 仅当_ungrouped非空时写入
Bug-R21-3 (HIGH): negated_date_ranges被覆盖 — =改为|=
Bug-R21-4 (MEDIUM): 日期/PMID/DOI/PMC条件在OR模式始终AND — 合并为or_(*conditions)
Bug-R21-5 (MEDIUM): _parse_atom无条件消费任何词符 — 类型验证守卫
Bug-R21-6 (MEDIUM): 模态框双重goToPage(1) — 按钮只关弹窗,搜索由watcher触发
Bug-R21-7 (MEDIUM): page.value失败后不回退 — 捕获异常恢复前一页
Bug-R21-8 (LOW): 空引号""[TI]产生空Term — text为空时跳过
Bug-R21-9 (LOW): 冗余函数内import re — 使用模块级导入
|
2026-07-28 16:52:31 +08:00 |
|
34047007@qq.com
|
53cf1d6b70
|
fix: 更新 test_lowercase_boolean_detected 断言匹配 R20 re.IGNORECASE 行为
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
P20 R20-3 为 is_pubmed_syntax() 布尔正则添加了 re.IGNORECASE,
小写 and/or/not 现在正确触发 PubMed 语法检测。更新测试断言以匹配新行为,
并在 P1-2 文档中注明 P20 修订。
|
2026-07-28 16:33:16 +08:00 |
|
34047007@qq.com
|
5dcf639b0b
|
fix: 第20轮搜索审计修复 — AND子组层级/OR模式NOT/长格式标签等6项
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
Bug-R20-1 (HIGH): AND子组在括号内被提升为顶层AND条件 — 新增sub_group_refs层级追踪
Bug-R20-2 (HIGH): OR模式NOT条件未独立AND — 分离UnaryExpression独立AND
Bug-R20-3 (MEDIUM): is_pubmed_syntax()不识别小写布尔运算符 — 添加re.IGNORECASE
Bug-R20-4 (MEDIUM): 长格式字段标签不被识别 — _ALL_FIELD_TAGS新增40+条目
Bug-R20-5 (MEDIUM): 400错误URL持久化导致刷新循环 — syncSearchToUrl移入try块
Bug-R20-6 (LOW): 空括号[]产生空Term — stripped为空时跳过
|
2026-07-28 16:30:03 +08:00 |
|
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
|
1401bb7173
|
fix: 第18轮搜索审计修复 — journal_iso补全/PA ui检查/text变量重命名等6项
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
- Bug-R18-1 (MEDIUM): MH:NOEXP在括号组内被忽略 → _parse_primary传播_noexp
- Bug-R18-2 (MEDIUM): full_date:year同一年份不交换 → swap条件>=修复
- Bug-R18-3 (HIGH): 非DOI"/"路径缺失journal_iso → 补充ILIKE
- Bug-R18-4 (MEDIUM): Chinese路径缺失journal_iso/pmid/doi → 补全ILIKE
- Bug-R18-5 (MEDIUM): PA仅检查name不检查ui → 增加or_(contains(ui))
- Bug-R18-6 (MEDIUM): text变量遮蔽SQLAlchemy text() → 重命名为_term_text
|
2026-07-28 15:46:20 +08:00 |
|
34047007@qq.com
|
5fa2fbec7b
|
fix: 第17轮搜索审计修复 — 缓存键中毒/_pubmed_conditions异常保护/引号短语exact强制
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
- P0-1 (HIGH): sub-path A query原地修改后缓存键未更新 → 重新计算
- P0-2 (MEDIUM): _pubmed_conditions无异常保护 → try/except降级flat text
- P0-3 (MEDIUM): 引号短语不强制exact_phrase → _phrase_terms_set跟踪
|
2026-07-28 15:12:13 +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
|
1f46f05586
|
fix: 第15轮搜索审计修复 — __RANGE_*标记在括号组内被错误处理
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
__RANGE_*标记(如__RANGE_EDAT__)是日期范围解析的副作用标记,
在顶层被正确过滤。但在括号组内(如(2024:2025[EDAT] AND cancer))
被_parse_primary放入result.groups,_pubmed_conditions遍历组内词
调用_single_term_condition时无对应handler,回退到纯文本搜索
_field_condition("all", "2024:2025"),返回零结果(静默数据丢失)。
修复:组遍历循环中跳过_is_range_end标记。
|
2026-07-28 13:50:43 +08:00 |
|
34047007@qq.com
|
7dfde12e46
|
docs: 第14轮搜索审计修复记录(4项修复)
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
|
2026-07-28 13:21:38 +08:00 |
|
34047007@qq.com
|
daf169d265
|
fix: 第14轮搜索审计修复 — 非DP日期字段单年值失效/跨字段year_from覆盖等4项修复
HIGH (2): 非DP日期字段(EDAT/CRDT/MHDA/LR/DCOM/DEP)单年值未设置
专用 *_from/*_to,EDAT/CRDT等列过滤静默失效;
跨日期字段 year_from/year_to 互相覆盖,DP条件被丢弃
MINOR (2): MHDA/LR/DCOM/DEP 缺少 _PARTIAL_DATE_RE 分支;
_single_term_condition 未处理括号组内日期字段
|
2026-07-28 13:21:24 +08:00 |
|
34047007@qq.com
|
c5f2f27d7f
|
docs: 第13轮搜索审计修复记录(21项P0-P2修复)
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
|
2026-07-28 12:59:44 +08:00 |
|
34047007@qq.com
|
1d345359fd
|
fix: 第13轮搜索审计修复 — _SPECIAL_FIELDS set.get()崩溃/boolean=or AND语义等21项修复
P0 (1): _SPECIAL_FIELDS 为 set 误调 .get() → (a OR b)[TI] 全面崩溃的回归修复
P1 (3): exclude_preprints 丢弃 NULL 记录;boolean=or 数字/文本词被 AND;
journal 排序 keyset 忽略 journal_iso 排序列
P2 (2): 日期字段接收非日期文本导致 SQL 错误;日期范围回退保留字段标签
MINOR (4): 二月非闰年扩展为29日;日期校验缺日历正确性;
尾部 AND 产生空 Term;精确短语 all 搜索缺 journal ILIKE
|
2026-07-28 12:59:38 +08:00 |
|
34047007@qq.com
|
80915f28a9
|
docs: 第12轮搜索审计修复记录(21项P0-P2修复)
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
|
2026-07-28 12:38:23 +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
|
89e154caa2
|
docs: 第11轮搜索审计修复记录(16项P0-P2修复)
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
|
2026-07-28 12:09:55 +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
|
4e964c955b
|
docs: 新增第10轮搜索审计修复记录(缓存键碰撞/OR语义/affiliation/前端OR和精确短语)
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
|
2026-07-28 11:41:38 +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
|
b26f5572e9
|
fix: 第9轮搜索深度审计 — MeSH headings 完全从 search_tsv 缺失等5项修复
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CRITICAL:
- MeSH headings search_tsv key 错误:trigger 用 value->>'name' 但数据存于
'descriptor' 键,导致 MeSH 术语对 tsvector 贡献完全丢失
- 新建 af4a8b2ec873 迁移:修复 key 名 + 全库回填
HIGH:
- 测试套件 test_service_search_engine.py 无断言价值(module-level mock
杀死缓存测试,所有 search() 只 assert total == 0)
- Affiliation 从 tsvector 剥离(f1a2b3c4d5e6 引入 author_names_text 时丢失)
MEDIUM:
- backfill_search_tsv.py 严重过期(缺 mesh/chemicals/genes/keywords)
LOW:
- features.py query 无 max_length 字符限制(仅 100 词限制)
docs: 13-搜索修复全记录.md 新增第9轮
|
2026-07-28 11:26:35 +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
|
c50831d1d8
|
test: 修复全量测试套件 — 1004 passed,消除注册限速 429 等故障
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
全部 auth 类 fixture 从 HTTP register 改为 DB 直接创建,绕过 6次/小时 IP 限速
(conftest、test_literature、test_subscriptions、test_verification、test_auth、
test_approvals、test_notifications、test_user_settings 共 8 个文件)。
同步修复 europe_pmc 解析、admin pipeline、ai_summary、email_service、
security/permissions 等共 21 个文件的断言和适配问题。
|
2026-07-27 22:19:27 +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
|
4a24f764f7
|
test: 更新 MeSH 打标测试适配 tag_service 重构
CI / backend (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
- _tag_article → tag_service.tag_article 导入路径
- 增加 name_en 查询 mock 返回值(3 次 execute 调用)
|
2026-07-27 16:16:43 +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
|
52a0d01823
|
perf: 模型索引优化 — tag_ids 反范式 + BRIN/partial/covering 索引
- GlobalLiterature.tag_ids ARRAY(Uuid) 列 + GIN 索引(标签筛选免 JOIN)
- BRIN 索引:pub_date / pub_year(时序数据,体积缩小 100x)
- Covering 索引:(pub_date, id) INCLUDE 高频列(index-only scan)
- Partial 索引:retracted / is_oa / is_negative_result / is_preprint
|
2026-07-27 16:16:30 +08:00 |
|
34047007@qq.com
|
0895359b6f
|
perf: 搜索引擎优化 — 五重缓存 + Keyset 全排序 + tag_ids 筛选
- ATM 展开缓存(atm:{md5}, 3600s TTL)
- 期刊 map 全表缓存(journals:map, 3600s TTL)
- 搜索结果精简缓存(search:{md5},不含 tags/journal 纯数据)
- 分面 year_counts 独立缓存(search:year_counts:{md5},首页用)
- 标签筛选改为 tag_ids && ARRAY[uids] GIN 索引扫描,免 JOIN
- Keyset 分页推广至 date/cited/title/journal/first_author 全部排序模式
- _keyset_condition() + _cursor_from_item() + _hydrate_items() 通用化
- COUNT 仅首页执行,结果缓存到分面键
|
2026-07-27 16:16:26 +08:00 |
|
34047007@qq.com
|
0b2bd87d61
|
perf: 标签二级缓存 + cache.mget 批量读取
- tag_loader 增加 Redis L2 缓存(tags:{lit_id}, 86400s TTL),批量 mget
- cache.py 新增 mget() 方法,同键 Redis 批量查询 + memory 降级
- tag_service.py 打标后自动清除对应缓存
|
2026-07-27 16:16:21 +08:00 |
|