背景与动机
Wiki 知识库目前的文件接入方式是单一的 sourceDirectory(已支持多行路径/glob)+ KB 级 watcher。在实际运营场景中(例如:多个爬虫定时落盘到不同服务器目录,分别对应不同业务来源),暴露出三个缺口:
- 路径没有身份 —— 多条路径混在一个换行分隔的文本字段里,无法命名(业务别名)、无法单独启停、无法单独触发扫描;
- 材料没有归属 ——
wiki_raw_material 不记录文件来自哪条路径,前端无法按来源分组展示、无法按来源批量运维(重扫/清理某一来源);
- 定时粒度太粗 —— watcher 只有 KB 级开关和全局间隔,无法为不同路径配置不同的同步计划(例如处罚公告每日 02:00、系统文档每周一次)。
我们团队已完成这一功能的完整前端交互设计(原型 + 需求文档,见 fork 分支 feat/wiki-raw-material-panel 的 wiki-improve/ 目录,含搜索/筛选/分组折叠/批量操作/异常分区/在线预览),前端部分将按单一关注点拆成独立 PR 提交。本 issue 提议补齐对应的后端实体,达成一致后我们来实现。
方案:扫描源实体化 wiki_kb_source
表结构
| 列 |
类型 |
说明 |
id |
BIGINT(雪花) |
|
kb_id |
BIGINT |
所属知识库 |
alias |
VARCHAR(128) |
业务别名,同 KB 内唯一 |
path |
VARCHAR(1024) |
单条路径或 glob(多路径 = 多条 source 记录) |
file_filter |
VARCHAR(256) |
可空;逗号分隔 glob(*.pdf, *.txt) |
cron |
VARCHAR(64) |
可空;空 = 不定时 |
enabled |
TINYINT/SMALLINT |
定时开关 |
create_time / update_time / deleted |
|
通用约定 |
wiki_raw_material 增加两列:
source_id(可空,不可变):文件的客观出处;手动上传/粘贴文本为 NULL;
group_override_id(可空):用户手动"迁移分组"改这一列,展示分组 = COALESCE(group_override_id, source_id)。
为什么两列而不是一列:如果迁移分组直接改 source_id,出处信息被销毁,且与增量扫描的按路径去重产生歧义(迁走的文件下次扫描是否重新归入原组?)。出处与组织方式分离后,迁移不影响去重判断。
两条设计约束
- 定时任务只做增量扫描,不提供"定时全量"。全量重扫 = 手动动作(扫描 + 对该 source 下已有材料批量 reprocess)。理由:全量意味着对目录下所有文件重跑 LLM 消化,放进 cron 是纯粹的 token 燃烧器。因此表中不设
scan_mode 列,模式仅作为手动扫描接口的参数。
- 路径校验复用
WikiSourcePathValidator(符号链接逃逸检查等),扫描复用 WikiDirectoryScanService 的既有去重(按解析后绝对路径跳过已存在文件,即天然增量)。
API
GET /api/v1/wiki/knowledge-bases/{kbId}/sources 列表(含每 source 文件数统计)
POST /api/v1/wiki/knowledge-bases/{kbId}/sources 创建
PUT /api/v1/wiki/knowledge-bases/{kbId}/sources/{sid} 更新
DELETE /api/v1/wiki/knowledge-bases/{kbId}/sources/{sid} 删除(材料保留,source_id 置空)
POST /api/v1/wiki/knowledge-bases/{kbId}/sources/{sid}/scan?mode=incr|full 单路径扫描
PUT /api/v1/wiki/knowledge-bases/{kbId}/raws/group 批量迁移分组 {rawIds, targetSourceId}
- 权限:全部
manage:wiki,与现有扫描一致
- 定时:扩展
WikiSourceWatcherService(ShedLock,锁粒度按 source),全局 watcher 开关继续作为总闸
兼容性
- 存量
sourceDirectory 保持可用;迁移脚本将非空的 sourceDirectory 按行拆为 source 记录(alias 默认"默认扫描路径 N"),字段标记废弃但不删除
- 迁移脚本按方言目录同版本号同步新增
- 有状态逻辑配测试(source CRUD、扫描归属写入、去重 × group_override 交互、定时增量)
分步计划
- PR-1(前端,不依赖本 issue):材料列表增强 — 搜索/筛选/排序/批量操作/在线预览/异常文件分区
- PR-2(后端,本 issue):
wiki_kb_source + 归属列 + API + 定时
- PR-3(前端接线):路径分组配置、单路径扫描、迁移分组,按原型完整落地
如方案方向认可,PR-2/PR-3 由我们团队实现提交。
背景与动机
Wiki 知识库目前的文件接入方式是单一的
sourceDirectory(已支持多行路径/glob)+ KB 级 watcher。在实际运营场景中(例如:多个爬虫定时落盘到不同服务器目录,分别对应不同业务来源),暴露出三个缺口:wiki_raw_material不记录文件来自哪条路径,前端无法按来源分组展示、无法按来源批量运维(重扫/清理某一来源);我们团队已完成这一功能的完整前端交互设计(原型 + 需求文档,见 fork 分支
feat/wiki-raw-material-panel的wiki-improve/目录,含搜索/筛选/分组折叠/批量操作/异常分区/在线预览),前端部分将按单一关注点拆成独立 PR 提交。本 issue 提议补齐对应的后端实体,达成一致后我们来实现。方案:扫描源实体化
wiki_kb_source表结构
idkb_idaliaspathfile_filter*.pdf, *.txt)cronenabledcreate_time/update_time/deletedwiki_raw_material增加两列:source_id(可空,不可变):文件的客观出处;手动上传/粘贴文本为 NULL;group_override_id(可空):用户手动"迁移分组"改这一列,展示分组 =COALESCE(group_override_id, source_id)。为什么两列而不是一列:如果迁移分组直接改
source_id,出处信息被销毁,且与增量扫描的按路径去重产生歧义(迁走的文件下次扫描是否重新归入原组?)。出处与组织方式分离后,迁移不影响去重判断。两条设计约束
scan_mode列,模式仅作为手动扫描接口的参数。WikiSourcePathValidator(符号链接逃逸检查等),扫描复用WikiDirectoryScanService的既有去重(按解析后绝对路径跳过已存在文件,即天然增量)。API
manage:wiki,与现有扫描一致WikiSourceWatcherService(ShedLock,锁粒度按 source),全局 watcher 开关继续作为总闸兼容性
sourceDirectory保持可用;迁移脚本将非空的sourceDirectory按行拆为 source 记录(alias 默认"默认扫描路径 N"),字段标记废弃但不删除分步计划
wiki_kb_source+ 归属列 + API + 定时如方案方向认可,PR-2/PR-3 由我们团队实现提交。