44
55---
66
7- ## 1. 一键更新(推荐)
7+ ## 1. 执行方式
88
99``` bash
10- # 更新到最新 S2 release
10+ # 方式 A:一键串联(下载 + 校验 + merge)
1111bash update.sh
1212
13- # 更新到指定日期
13+ # 更新到指定目标 release
1414bash update.sh 2026-03-10
15+
16+ # 方式 B:拆分执行
17+ # 1) 只下载增量 diff
18+ bash update_download.sh 2026-03-10
19+
20+ # 2) 只校验已下载好的增量 diff
21+ bash update_validate.sh 2026-03-10
22+
23+ # 3) 只 merge 已下载好的增量目录
24+ bash update_merge.sh PaperData/incremental/2026-01-27_to_2026-03-10
1525```
1626
17- 脚本自动完成以下流程:
27+ 推荐做法:
28+
29+ 1 . 网络不稳定、只想先把文件拉下来时,先运行 ` update_download.sh `
30+ 2 . 文件下完后,再运行 ` update_validate.sh ` 做完整校验与坏文件重下
31+ 3 . 需要重复调试 merge、断点恢复或只想继续上次合并时,直接运行 ` update_merge.sh `
32+ 4 . ` update.sh ` 仅作为方便的一键封装,本质上顺序调用三者
33+
34+ ` update.sh ` 自动完成以下流程:
1835
19361 . 从 ` corpus/current_release.txt ` 读取当前版本
20372 . 查询 S2 API 获取可用 releases,确定目标版本
21383 . 下载增量 diff 到 ` PaperData/incremental/ `
22- 4 . 合并到 SQLite(paper_metadata、citations、ID 映射)+ FTS5
23- 5 . 编码新增/修改论文的 BGE-M3 向量,upsert 到 Qdrant;删除已移除论文的向量
24- 6 . 更新 ` corpus/current_release.txt ` 为最新版本
39+ 4 . 校验已下载 diff,并对损坏/缺失文件重下
40+ 5 . 合并到 SQLite(paper_metadata、citations、ID 映射)+ FTS5
41+ 6 . 编码新增/修改论文的 BGE-M3 向量,upsert 到 Qdrant;删除已移除论文的向量
42+ 7 . 更新 ` corpus/current_release.txt ` 为最新版本
2543
2644### 前置条件
2745
@@ -82,7 +100,8 @@ GET /diffs/{start_release_id}/to/{end_release_id}/{dataset_name}
82100| -------------| --------------|
83101| papers | ` corpusid ` |
84102| abstracts | ` corpusid ` |
85- | paper-ids | ` corpusid ` |
103+ | paper-ids updates | ` corpusid ` |
104+ | paper-ids deletes | ` sha ` |
86105| authors | ` authorid ` |
87106| citations | ` citationid ` |
88107
@@ -95,13 +114,33 @@ GET /diffs/{start_release_id}/to/{end_release_id}/{dataset_name}
95114### 4.1 下载增量 diff
96115
97116``` bash
98- # 自动从 corpus/current_release.txt 读取起始版本,下载到最新
99- python build_corpus/data/download_incremental_diffs.py
117+ # 推荐:通过 shell 入口下载
118+ bash update_download.sh
119+
120+ # 指定目标 release
121+ bash update_download.sh 2026-03-10
100122
101- # 指定起止版本
123+ # 单独校验并为损坏文件补下
124+ bash update_validate.sh 2026-03-10
125+
126+ # 或直接调用 Python 脚本
127+ python build_corpus/data/download_incremental_diffs.py
102128python build_corpus/data/download_incremental_diffs.py --start 2026-01-27 --end 2026-03-10
129+ python build_corpus/data/download_incremental_diffs.py --start 2026-01-27 --end 2026-03-10 --mode validate
103130```
104131
132+ 下载阶段与校验阶段现在分开:
133+
134+ - ` update_download.sh `
135+ - 只负责“文件是否存在”
136+ - 若目标文件已存在,直接跳过
137+ - 若上次中断留下 ` .tmp ` ,会自动断点续下
138+ - ` update_validate.sh `
139+ - 负责完整校验 ` .gz/.jsonl ` 内容
140+ - 若文件缺失或损坏,会自动重新下载
141+ - 会在增量目录下维护 ` _download_validation_progress.json `
142+ - 已校验通过的文件会被记录,下次校验时直接跳过
143+
105144### 输出目录结构
106145
107146```
@@ -130,6 +169,10 @@ PaperData/
130169### 4.2 合并到数据库
131170
132171``` bash
172+ # 推荐:通过 shell 入口 merge
173+ bash update_merge.sh PaperData/incremental/2026-01-27_to_2026-02-24
174+
175+ # 或直接调用 Python 脚本
133176python build_corpus/merge_incremental.py PaperData/incremental/2026-01-27_to_2026-02-24
134177```
135178
@@ -139,6 +182,17 @@ python build_corpus/merge_incremental.py PaperData/incremental/2026-01-27_to_202
139182- FTS5:刷新 paper_fts_title 和 paper_fts_combined
140183- Qdrant:编码新增/修改论文的 BGE-M3 向量并 upsert,删除已移除论文的向量
141184
185+ 补充说明:
186+
187+ - ` merge_incremental.py ` 会为每个数据集步骤显示文件级 ` tqdm ` 进度条
188+ - Qdrant 编码阶段也会显示批量进度
189+ - merge 过程中会在增量目录下写入 ` _merge_progress.json `
190+ - ` _merge_progress.json ` 记录步骤级状态;对 ` papers-updates ` 、` abstracts-updates ` 、` citations-updates ` 、` citations-deletes ` 这类重步骤,会额外记录已成功 commit 的 chunk offset
191+ - 如果进程中断,重新执行同一 ` INCR_DIR ` 时会自动跳过已完成步骤并继续
192+ - 若上述重步骤中途失败,会从上一个成功 commit 的 chunk 继续,而不是从步骤开头完全重跑
193+ - 全部完成后 ` _merge_progress.json ` 会自动删除
194+ - 如果 merge 时发现损坏或不可读的 diff 文件,会直接报错并中止;应先回到下载阶段重新拉取文件
195+
142196### 4.3 更新版本记录
143197
144198``` bash
@@ -151,9 +205,12 @@ echo "2026-02-24" > corpus/current_release.txt
151205
152206| 脚本 | 作用 |
153207| ------| ------|
154- | ` update.sh ` | 一键更新入口(下载 + 合并 + 版本更新) |
208+ | ` update.sh ` | 一键更新入口(调用下载脚本 + merge 脚本) |
209+ | ` update_download.sh ` | 只下载增量 diff,不执行完整校验、不执行 merge |
210+ | ` update_validate.sh ` | 只校验增量 diff,并对缺失/损坏文件重下 |
211+ | ` update_merge.sh ` | 只对指定增量目录执行 merge,并更新版本记录 |
155212| ` build_corpus/data/download_incremental_diffs.py ` | 下载增量 diff 到 PaperData 目录 |
156- | ` build_corpus/merge_incremental.py ` | 合并增量到 SQLite + FTS5 + Qdrant |
213+ | ` build_corpus/merge_incremental.py ` | 合并增量到 SQLite + FTS5 + Qdrant,支持断点续传 |
157214| ` build_corpus/optimize_fts.py ` | FTS5 索引优化(建议更新后执行) |
158215
159216---
@@ -163,5 +220,11 @@ echo "2026-02-24" > corpus/current_release.txt
163220- 需要配置 ` S2_API_KEY ` (` .env ` 或环境变量)以访问 Datasets API。
164221- diff 的 ` update_files ` 、` delete_files ` 为预签名 URL,有时效,建议下载后本地保存。
165222- 合并时需保证主键一致(如 ` corpusid ` 、` citationid ` 、` authorid ` )。
223+ - ` paper-ids ` 的主键口径需要分开看:` updates ` 用 ` corpusid ` ,` deletes ` 用 ` sha `
166224- 合并完成后增量文件保留在 ` PaperData/incremental/ ` 中,不会自动删除。
167225- 合并过程中 Qdrant 向量编码需要 GPU,确保有可用的 CUDA 设备。
226+ - 如果只想补文件,不必每次完整校验;先跑 ` update_download.sh ` 即可。
227+ - 如果只想重复 merge,不要先跑下载/校验;直接执行 ` update_merge.sh ` 即可。
228+ - ` _merge_progress.json ` 属于 merge 的运行时状态文件;若一次 merge 已完整成功,它会自动被清理。
229+ - ` _download_validation_progress.json ` 属于校验阶段的运行时状态文件;会保留在增量目录下,供下次继续校验时复用。
230+ - chunk 或步骤重跑不会在 SQLite 或 Qdrant 中产生“重复数据行”;当前实现依赖 upsert/delete 的幂等性,但会产生额外耗时。
0 commit comments