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.
This commit is contained in:
34047007@qq.com
2026-07-27 08:35:12 +08:00
parent 35b0a5c565
commit 62ca8fa6b8
82 changed files with 314248 additions and 1519 deletions
+209 -139
View File
@@ -1,9 +1,9 @@
# 文献数据质量报告
> 报告日期:2026-07-24
> 报告日期:2026-07-25
> 数据来源:本地 PostgreSQL 数据库(scilit_dev
> 总文献数:1,662 篇
> 数据来源分布:seed_data = 110, pubmed_api = 1,552
> 总文献数:56,432 篇
> 数据来源分布:PubMed 基线文件(pubmed26n0001~0015.xml.gz
---
@@ -13,80 +13,135 @@
| 字段 | 覆盖数 | 覆盖率 | 数据类型 | 状态 |
|------|--------|--------|---------|------|
| `pmid` | 1,662 | **100.0%** | INTEGER | ✅ 完整 |
| `title` | 1,652 | **99.4%** | TEXT | ✅ 完整 |
| `abstract` | 1,550 | **93.3%** | TEXT | ✅ 充分 |
| `doi` | 1,548 | **93.1%** | VARCHAR(255) | ✅ 充分 |
| `journal` | 1,662 | **100.0%** | VARCHAR(255) | ✅ 完整 |
| `journal_issn` | 1,662 | **100.0%** | VARCHAR(20) | ✅ 完整 |
| `journal_iso` | **0** | **0%** | VARCHAR(100) | **缺失** |
| `pub_year` | 1,662 | **100.0%** | INTEGER | ✅ 完整 |
| `pub_date` | 1,148 | **69.1%** | DATE | ⚠️ 部分 |
| `volume` | 1,292 | 77.7% | VARCHAR(20) | |
| `issue` | 1,247 | 75.0% | VARCHAR(20) | |
| `pages` | 1,117 | 67.2% | VARCHAR(50) | |
| `language` | 1,644 | **98.9%** | VARCHAR(10) | ✅ 充分 |
| `pmc_id` | **9** | **0.5%** | VARCHAR(20) | ❌ Bug |
| `is_oa` | 9 | 0.5% | BOOLEAN | ❌ Bug |
| `retracted` | 0 | 0% | BOOLEAN | ✅(全库无撤稿) |
| `pmid` | 56,432 | **100.0%** | INTEGER | ✅ 完整 |
| `title` | 56,432 | **100.0%** | TEXT | ✅ 完整 |
| `abstract` | 29,627 | **52.5%** | TEXT | ⚠️ 部分(早期文献多无摘要)|
| `doi` | 869 | **1.5%** | VARCHAR(500) | ⚠️ 低(1970s 文献无 DOI|
| `journal` | 56,432 | **100.0%** | VARCHAR(500) | ✅ 完整 |
| `journal_issn` | 56,432 | **100.0%** | VARCHAR(20) | ✅ 完整 |
| `journal_iso` | 56,432 | **100.0%** | VARCHAR(100) | ✅ 完整(基线文件有完整 ISO 缩写) |
| `pub_year` | 56,432 | **100.0%** | INTEGER | ✅ 完整 |
| `pub_date` | 52,124 | **92.4%** | DATE | ✅ 充分 |
| `print_date` | 52,124 | **92.4%** | DATE | ✅ 充分 |
| `create_date` | 56,432 | **100.0%** | DATE | ✅ 完整 |
| `entrez_date` | 56,432 | **100.0%** | DATE | ✅ 完整 |
| `article_date` | 714 | **1.3%** | DATE | ⚠️ 低(ArticleDate 为新版 PubMed XML 字段)|
| `date_completed` | 56,218 | **99.6%** | DATE | ✅ 完整 |
| `pubmed_revised` | 56,432 | **100.0%** | DATE | ✅ 完整 |
| `volume` | 54,460 | **96.5%** | VARCHAR(50) | ✅ 充分 |
| `issue` | 52,921 | **93.8%** | VARCHAR(50) | ✅ 充分 |
| `pages` | 56,127 | **99.5%** | VARCHAR(100) | ✅ 完整 |
| `language` | 56,432 | **100.0%** | VARCHAR(10) | ✅ 完整 |
| `pmc_id` | 3,616 | **6.4%** | VARCHAR(20) | ⚠️ 低(1970s 文献极少有 PMC|
| `publication_status` | 56,432 | **100.0%** | VARCHAR(30) | ✅ 完整 |
| `citation_status` | 56,432 | **100.0%** | VARCHAR(20) | ✅ 完整 |
| `num_refs` | 4,483 | **7.9%** | INTEGER | ⚠️ 低 |
| `retracted` | 0 | 0% | BOOLEAN | ✅(全库无撤稿)|
### JSON 字段
| 字段 | 非空计数 | 覆盖率 | 数据类型 | 状态 |
|------|---------|--------|---------|------|
| `authors` | 1,659 | **99.8%** | json | ✅ 完整 |
| `pub_types` | 1,557 | **93.7%** | json | ✅ 充分 |
| `mesh_headings` | 845 | **50.8%** | json | ⚠️ 部分 |
| `study_design` | 1,552 | **93.4%** | json | ✅ 充分 |
| `chemical_list` | 508 | **30.6%** | json | ⚠️ 部分 |
| `grants` | 323 | **19.4%** | json | ⚠️ 部分 |
| `databank_list` | 29 | **1.7%** | json | ❌ 缺失 |
| `suppl_mesh_list` | 19 | **1.1%** | json | ❌ 缺失 |
| `keywords` | **0** | **0%** | json | ❌ **缺失** |
| `gene_symbols` | **0** | **0%** | json | ❌ **缺失** |
| `retraction_details` | 0 | 0% | json | ✅(全库无撤稿) |
| `full_text_sections` | 7 | **0.4%** | json | ❌ 仅 PMC OA 实验 |
| `authors` | 55,466 | **98.3%** | JSONB | ✅ 完整 |
| `pub_types` | 56,432 | **100.0%** | JSONB | ✅ 完整 |
| `mesh_headings` | 56,066 | **99.4%** | JSONB | ✅ 完整 |
| `study_design` | 56,432 | **100.0%** | JSONB | ✅ 充分(自动分类)|
| `chemical_list` | 32,209 | **57.1%** | JSONB | ✅ 充分 |
| `trial_reg` | 56,432 | **100.0%** | JSONB | ✅ 完整(含空对象)|
| `retraction_details` | 55,555 | **98.4%** | JSONB | ✅ 充分(主要含空对象)|
| `grants` | 252 | **0.4%** | JSONB | ❌ 缺失(早期文献基金信息极少)|
| `keywords` | 0 | **0%** | JSONB | ⚠️ 基线文件 KeywordList 含大量空数据,需确认 |
| `gene_symbols` | 0 | **0%** | JSONB | ❌ 未解析 |
| `databank_list` | 25 | **0.0%** | JSONB | ❌ 缺失 |
| `suppl_mesh_list` | 18 | **0.0%** | JSONB | ⚠️ 极少 |
| `full_text_sections` | 446 | **0.8%** | JSONB | ⚠️ PMC OA 解析中 |
### TSVECTOR 字段
| 字段 | 覆盖数 | 覆盖率 | 状态 |
|------|--------|--------|------|
| `search_tsv` | 1,662 | **100.0%** | ✅ 完整(但无 setweight |
| `search_tsv` | 56,432 | **100.0%** | ✅ 完整(setweight title=A, abstract=B, author=A |
### 日期间相关字段
### 日期间字段
| 字段 | 覆盖数 | 覆盖率 | 状态 |
|------|--------|--------|------|
| `pub_date` | 1,148 | 69.1% | ⚠️ 部分 |
| `article_date` | 1,148 | 69.1% | ⚠️ 部分 |
| `pubmed_revised` | 1,552 | 93.4% | ✅ 充分 |
| `date_completed` | 558 | 33.6% | ⚠️ 部分 |
| `publication_status` | 1,552 | 93.4% | ✅ 充分 |
| `citation_status` | 879 | 52.9% | ⚠️ 部分 |
| 字段 | 覆盖数 | 覆盖率 | PubMed 标签 | 状态 |
|------|--------|--------|-------------|------|
| `pub_date` | 52,124 | 92.4% | [DP] 出版日期 | ✅ 充分 |
| `print_date` | 52,124 | 92.4% | [PPDAT] 纸质出版 | ✅ 充分 |
| `article_date` | 714 | 1.3% | [EPDAT] 电子出版 | ⚠️ 低 |
| `create_date` | 56,432 | 100.0% | [CRDT] 记录创建 | ✅ 完整 |
| `entrez_date` | 56,432 | 100.0% | [EDAT] 收录日期 | ✅ 完整 |
| `date_completed` | 56,218 | 99.6% | [MHDA] MeSH 标引 | ✅ 完整 |
| `meshed_date` | 56,218 | 99.6% | 系统内部 | ✅ 首次导入=date_completed214 篇 in-process 为 NULL |
| `pubmed_revised` | 56,432 | 100.0% | [LR] 修订 | ✅ 完整 |
| `publication_status` | 56,432 | 100.0% | — | ✅ 完整(VARCHAR,非日期)|
> **类型变更说明:** `create_date`/`entrez_date`/`date_completed`/`meshed_date`/`pubmed_revised` 五个字段原为 TIMESTAMPTZ,现统一为 DATE。NLM 所有日期来源仅提供 Y/M/D,无时间分量。DATE 类型更精确地反映语义且减少存储。当前数据中 3 个字段 6 位时间分量均为 00:00:00+00:00,无损转换。
---
## 2. 数据诊断
## 2. 数据分布特征
### 2.1 关键 Bug
### 年份分布
| # | 问题 | 影响 | 根因 |
|---|------|------|------|
| 1 | `journal_iso` 0% | [TA] 缩写期刊搜索不可用 | XML 解析器已解析但 Europe PMC 路径未解析?实际检查代码第 533 行已解析,但 seed_data 无此字段 |
| 2 | `keywords` 0% | [OT] 关键词搜索不可用 | XML 解析器第 500-503 行已解析,需检查 seed_data 和 Europe PMC 路径 |
| 3 | `pmc_id` 仅 9 篇 | [PMC] 搜索不可用,PMC OA 全文抓取不可用 | XPath 上下文 Bug`article.findall` → 应改为 `article_elem.findall` |
| 4 | `tree_numbers` 0 行 | 所有 [MH]/[MAJR] 查询 0 结果 | NLM mtrees.bin 未导入,`import_mesh_tags.py` 未执行 |
| 5 | `suppl_mesh_list` 仅 1.1% | 补充 MeSH 搜索不可用 | 解析器已实现但 NLM 数据量小 |
| 年份 | 文献数 | 占比 |
|------|--------|------|
| 1975 | 6,017 | 10.7% |
| 1976 | 5,789 | 10.3% |
| 1977 | 11,907 | 21.1% |
| 1978 | 12,938 | 22.9% |
| 1979 | 18,903 | 33.5% |
| 1980 | 1 | <0.1% |
| 2025 | 1 | <0.1% |
| 2026 | 876 | 1.6% |
### 2.2 数据异常
> 基线文件按 PMID 递增排序(PMID ≈ 时间顺序),前 15 个文件覆盖 1975–1979 为主。
> 后续导入文件 0016+ 将逐步覆盖 1980s2020s。
| 问题 | 详情 |
|------|------|
| 年份集中 | 1,604/1,662 (96.5%) ∈ 2026,早期文献极少(仅有 58 篇 2025 年) |
| 被引为 0 | 中位被引次数为 0,平均值 0.6 |
| 标签稀疏 | 每篇文献中位仅 1 个标签(P99=6),28/99 标签关联 0 篇文献 |
| 标签来源单一 | 99 个标签全部 `source=manual`,无 `mesh``auto` 来源标签 |
| 中文极少 | 35/1,662 (2.1%) 中文文献 |
### 语言分布 Top 10
| 语言 | 文献数 | 占比 |
|------|--------|------|
| English (eng) | 41,300 | 73.2% |
| German (ger) | 4,496 | 8.0% |
| French (fre) | 2,603 | 4.6% |
| Russian (rus) | 2,517 | 4.5% |
| Japanese (jpn) | 1,641 | 2.9% |
| Italian (ita) | 853 | 1.5% |
| Polish (pol) | 734 | 1.3% |
| Spanish (spa) | 549 | 1.0% |
| Czech (cze) | 253 | 0.4% |
| Romanian (rum) | 246 | 0.4% |
### 文献类型 Top 10
| 类型 | 文献数 |
|------|--------|
| Journal Article | 54,249 |
| Case Reports | 11,850 |
| Research Support, U.S. Gov't, P.H.S. | 9,935 |
| English Abstract | 7,766 |
| Comparative Study | 4,704 |
| Review | 4,632 |
| Letter | 1,611 |
| Clinical Trial | 1,520 |
| Research Support, U.S. Gov't, Non-P.H.S. | 1,289 |
| Randomized Controlled Trial | 504 |
### Top 10 期刊
| 期刊 | ISO 缩写 | 文献数 |
|------|---------|--------|
| Lancet | Lancet | 1,781 |
| Cancer | Cancer | 1,577 |
| Cancer Research | Cancer Res | 1,496 |
| Journal of the National Cancer Institute | J Natl Cancer Inst | 1,166 |
| Cancer Treatment Reports | Cancer Treat Rep | 642 |
| Proceedings of the National Academy of Sciences | Proc Natl Acad Sci USA | 633 |
| AJR American Journal of Roentgenology | AJR Am J Roentgenol | 579 |
| International Journal of Cancer | Int J Cancer | 554 |
| Rofo | Rofo | 475 |
| Journal of Immunology | J Immunol | 442 |
---
@@ -96,108 +151,123 @@
| 来源 | 数量 | Active |
|------|------|--------|
| manual | 99 | True |
| manual(种子标签) | 99 | 99 (100%) |
| auto(管道懒创建) | 10,303 | 0 (0%) |
| meshC04 导入) | 0 | — |
| **总计** | **10,402** | **99 (1.0%)** |
`global_tag_tree_numbers`**0 行**(空表)
`global_tag_tree_numbers`**0 行**(空表 — NLM mtrees 尚未导入
### 文献-标签关系
| 指标 | 值 |
|------|----|
| 总关联数 | 997 |
| is_major=True | 946 (94.9%) |
| is_major=False | 51 (5.1%) |
| 每篇标签 P50 | 1 |
| 每篇标签 P75 | 2 |
| 每篇标签 P90 | 5 |
| 每篇标签 P99 | 6 |
| 未使用标签 | 28 个(0 篇文献关联) |
| 已打标文献 | 56,066 (99.4%) |
| 总关联数 | 635,126 |
| is_major=True | 38,388 (6.0%) |
| 每篇标签 P50 | 11 |
| 每篇标签 P75 | 14 |
| 每篇标签 P90 | 17 |
| 每篇标签 P99 | 23 |
### Top 10 标签覆盖率
### Top 15 标签
| 标签 | 关联文献数 |
|------|-----------|
| 标签 #1 | 66 |
| 标签 #2 | 62 |
| 标签 #3 | 55 |
| 标签 #4 | 51 |
| 标签 #5 | 50 |
| 标签 #6 | 50 |
| 标签 #7 | 48 |
| 标签 #8 | 47 |
| 标签 #9 | 44 |
| 标签 #10 | 41 |
| 标签名 | source | 关联文献数 |
|--------|--------|-----------|
| Humans | auto | 43,509 |
| Female | auto | 24,067 |
| Male | auto | 21,162 |
| Animals | auto | 14,960 |
| Adult | auto | 14,023 |
| Middle Aged | auto | 13,893 |
| Aged | auto | 9,380 |
| Mice | auto | 6,696 |
| Adolescent | auto | 5,505 |
| Neoplasms | auto | 5,076 |
| Child | auto | 5,016 |
| Neoplasms, Experimental | auto | 4,860 |
| Rats | auto | 4,252 |
| Cell Line | auto | 4,123 |
| Neoplasm Metastasis | manual | 4,083 |
> auto 标签 `is_active=False`,对用户端不可见。需审核确认有意义标签后激活。
---
## 4. pubmed_api 来源字段质量
## 4. 出版状态与引用状态
1,552 篇 `source=pubmed_api` 的字段覆盖:
### Publication Status
| 字段 | coverage | 说明 |
|------|----------|------|
| publication_status | 1,552 (100%) | ppublish=544, epublish=530, aheadofprint=478 |
| citation_status | 879 (56.6%) | MEDLINE=502, Publisher=254, In-Process=64, PubMed-not-MEDLINE=59 |
| language | 1,534 (98.8%) | eng=1,496, en… 等 |
| study_design | 1,552 (100%) | 自动分类结果 |
| trial_reg | ~93% | 大部分有(即使空对象) |
| chemical_list | ~31% | 部分文献有化学列表 |
| grants | ~21% | 部分文献有基金信息 |
| databank_list | ~2% | 极少 |
| suppl_mesh_list | ~1% | 极少 |
| full_text_sections | 7 | 仅实验性抓取 |
---
## 5. 优先改进项
### P0(影响搜索基础功能)
| 改进项 | 当前 | 目标 | 方法 |
|--------|------|------|------|
| `journal_iso` 覆盖率 | 0% → **100%** | 修复 seed_data 和 Europe PMC 路径的 journal_iso 解析 |
| `tree_numbers` | 0 行 → **全量** | 运行 `import_mesh_tags.py` 导入 NLM mtrees2025.bin |
| `is_negative_result` | 仅 pubmed_api 有 → **所有** | 构造函数补全 + seed_data 回填 |
| 构造函数 5 字段 | 部分缺失 → **全部** | 代码修复 |
### P1(影响搜索能力)
| 改进项 | 说明 |
|--------|------|
| `keywords` 覆盖率 0% → 有数据 | 修复 keyword 解析器路径 |
| `pmc_id` 覆盖率提升 | XPath Bug 修复后运行 pipeline 回填 |
| `entrez_date` 新字段 | PubmedData/History 解析 |
| `grants` Europe PMC 路径补全 | grants 从 Europe PMC JSON 解析 |
### P2(影响搜索体验)
| 改进项 | 说明 |
| 状态 | 文献数 |
|------|--------|
| 缺失索引(6 个) | B-tree + GIN + trigram |
| JSON 列 json → jsonb | 启用 `@>` 等运算符 |
| `GlobalTagTreeNumber` 导出 | 模型导出修复 |
| ppublish(纸质出版) | 55,821 |
| epublish(电子出版) | 459 |
| aheadofprint(先于印刷) | 152 |
### Citation Status
| 状态 | 文献数 |
|------|--------|
| MEDLINE | 56,066 |
| Publisher | 153 |
| PubMed-not-MEDLINE | 153 |
| In-Process | 60 |
---
## 6. 数据库索引现状
## 5. 索引现状
### 当前索引
```
ix_global_literature_pub_date B-tree (pub_date)
ix_global_literature_search_tsv GIN (search_tsv)
ix_global_literature_pmid UNIQUE B-tree (pmid)
ix_global_literature_doi UNIQUE B-tree (doi)
idx_gl_pub_date B-tree (pub_date)
idx_gl_pub_year B-tree (pub_year)
idx_gl_journal_issn B-tree (journal_issn)
idx_gl_journal_iso B-tree (journal_iso)
idx_gl_created B-tree (created_at)
idx_gl_pmc_id B-tree (pmc_id)
idx_gl_search_tsv GIN (search_tsv)
ix_gl_doi B-tree (doi)
ix_gl_language B-tree (language)
ix_gl_retracted B-tree (retracted)
ix_gl_pub_types_gin GIN (pub_types)
ix_gl_study_design_gin GIN (study_design)
ix_gl_grants_gin GIN (grants)
ix_gl_chemical_list_gin GIN (chemical_list)
```
### 缺失索引
所有索引已就位。
| 索引 | 类型 | 用途 |
|------|------|------|
| `ix_global_literature_journal_iso` | B-tree | `[TA]` 期刊缩写搜索 |
| `ix_global_literature_pub_types` | GIN jsonb_path_ops | 文献类型筛选 |
| `ix_global_literature_study_design` | GIN jsonb_path_ops | 研究设计筛选 |
| `ix_global_literature_retracted` | B-tree | 撤稿过滤 |
| `ix_global_literature_language` | B-tree | `[LA]` 搜索 |
| `ix_global_literature_grants` | GIN | `[GR]` JSONB 搜索 |
| `ix_global_literature_chemical_list` | GIN | `[NM]` JSONB 搜索 |
---
## 6. 关键质量评估
### ✅ 强项
- 6 个 PubMed 日期字段全部完整(create_date/entrez_date 100%
- `journal_iso` 100%([TA] 缩写期刊搜索可用)
- `mesh_headings` 99.4%(可支持 [MH]/[MAJR] 打标搜索)
- `study_design` 100%(研究设计分类覆盖完整)
- `publication_status` / `citation_status` 100%(完整元数据)
- 搜索 tsvector 100%(带 setweight 权重)
- 标签关联 635,126 条,每篇中位 11 标签
### ⚠️ 待改进
- `abstract` 仅 52.5%(早期文献特点,后续文件 1980s+ 会改善)
- `doi` 仅 1.5%(同上,后续文件改善)
- `article_date`[EPDAT])仅 1.3%ArticleDate 为 PubMed XML 较新字段)
- `keywords` 0%(基线文件中 KeywordList 多为空,需确认是否需要填补)
- `grants` 0.4%(早期文献基金数据极少)
- `tree_numbers` 0 行 — **[MH] 子树展开不可用**,需导入 NLM mtrees
- 10,303 个 auto 标签 `is_active=False` — 需审核激活有意义标签
- PMC 覆盖 6.4%1970s 文献无 PMC 正常)
### 📌 基线文件进度说明
当前仅导入了前 15 个基线文件(pubmed26n0001~0015)。PubMed 2026 年基线共 590 个文件,当前覆盖约 2.5%。
后续文件特性(基于 PMID 递增规律):
- 0016~020019801999 年文献
- 0201~040020002015 年文献
- 0401~059020162026 年文献
随着更多文件的导入,DOI/abstract/PMC 覆盖率将显著提升。