返回 Bug 清单
BUG-0396project-13高已修复backend-logic

把字符串主键经 (long) hashCode() 转换后写入,使 ON CONFLICT 永不命中,幂等导入变成数据翻倍

发现:2026-10-03验证:2026-10-09置信度:95%

症状

重复执行导入后向量表行数翻倍(1248→2496),出现大量同内容重复行;检索结果重复;接口全程无报错、返回全绿。

根因

upsertKnowledgeVector 的键参数声明为 Long,调用方为了让字符串 ID 编译通过写成 (long) kidObj.hashCode()。hashCode 与原字符串不等价,于是每次 upsert 都插入新行(ON CONFLICT 永不触发);同时该 upsert 用 EXCLUDED.metadata 整体覆盖,丢掉了原有元数据。

修复方案

①把签名从 Long knowledgeId 改为 String knowledgeId,全链路(VectorSearchService / PgVectorSearchService / NoOpVectorSearchService / JsonbVectorSearchService / KnowledgeChunkEmbeddingService)统一用字符串直传,禁止任何 hash/parse 转换;②PgVectorSearchService 的 metadata 由覆盖改为合并 COALESCE(knowledge_vectors.metadata,'{}'::jsonb) || EXCLUDED.metadata;③清理已产生的重复行(删除 1247 条 hash 行并补回被覆盖的 1 条);④补幂等回归测试:连续执行两次,行数必须不变。

错误签名

knowledge_vectors 行数 1248 → 2496;存在 1248 组重复 content;API 全部返回 success

技术信息

来源项目

project-13

涉及文件

backend/src/main/java/com/project-13/service/ai/VectorReimportService.java, backend/src/main/java/com/project-13/service/vector/VectorSearchService.java, backend/src/main/java/com/project-13/service/vector/PgVectorSearchService.java +1

标签

幂等性, 主键转换, ON CONFLICT, 数据翻倍, project-13...