
类型:向量数据库
简介:存储、索引和管理由深度神经网络和机器学习(ML)模型生成的大规模嵌入向量。
本文介绍 Milvus 数据更新和删除方法,包括版本字段设计、upsert 思路、按条件删除、软删除、旧数据清理和回滚验证。
一、向量数据更新不能只看“覆盖”
知识库、商品库和搜索库都会遇到数据更新。文档内容变了,商品信息改了,旧版本资料失效了,都需要更新 Milvus 中的数据。
很多人会想到“直接覆盖旧数据”。但在正式项目里,直接覆盖并不总是最安全。因为你需要知道:
- 哪些数据来自旧版本;
- 新版本是否已经验证可用;
- 如果新版本效果不好,能不能回滚;
- 删除操作是否会误删其他数据。
因此,Milvus 数据更新更推荐按版本管理,而不是简单覆盖。
二、先给数据加上版本字段
如果早期没有版本字段,后面更新会很难。建议在 Collection 中保留这些字段:
doc_id:文档编号;chunk_id:片段编号;version:版本号;status:状态;source:来源;updated_at:更新时间。
1、doc_id 用来定位文档
同一份文档可能被切成多个片段,这些片段应共享同一个 doc_id。更新整份文档时,就可以按 doc_id 找到相关片段。
2、version 用来区分新旧内容
例如:
2026-06v1v22026-q3
版本号不一定复杂,但要稳定、可识别。
3、status 用来做软删除
可以用 active 和 inactive 标记数据是否参与检索。软删除的好处是更安全,出问题时还能恢复。
三、推荐的更新流程
正式项目中,建议按下面顺序更新数据。
1、先写入新版本
不要一开始就删除旧版本。先把新文档切分、生成向量,并写入新的 version。
2、用测试问题验证新版本
写入后,用固定问题集测试。重点看:
- 是否命中新内容;
- 是否还命中过期内容;
- 返回来源是否正确;
- 回答是否符合业务预期。
3、确认后再清理旧版本
确认新版本可用后,再按 doc_id 和旧 version 删除旧数据,或把旧数据状态改为 inactive。
这种方式比直接覆盖更稳妥。
四、upsert 适合哪些场景
Milvus 官方文档提供了数据插入、更新、删除等操作能力。具体是否使用 upsert,要结合主键策略和当前版本支持情况。
1、适合主键明确的数据
如果每条记录都有稳定主键,upsert 可以用于替换同一主键的数据。
2、不适合混乱主键的数据
如果片段 ID 每次切分都会变化,就不适合直接按主键覆盖。此时更适合按 doc_id + version 写入新批次,再清理旧批次。
3、更新前先备份导入日志
无论使用 insert、upsert 还是 delete,都建议保存导入日志。日志能告诉你这批数据从哪里来、切了多少片、写入了多少条。
五、删除数据前先统计影响范围
删除操作要谨慎。按条件删除前,应先用相同条件查询或统计,确认会影响哪些记录。
1、常见删除条件
可以按这些条件删除:
- 某个
doc_id; - 某个旧
version; status = inactive的数据;- 某个来源文件;
- 某个分类下的过期数据。
2、不要使用过宽条件
如果条件写得太宽,可能误删大量数据。例如只按分类删除,而没有加版本或来源限制,就可能删掉仍在使用的数据。
六、软删除更适合高风险更新
软删除不是立即删除记录,而是把状态改为不可用,例如把 status 设置为 inactive。搜索时通过过滤条件只检索 active 数据。
软删除适合:
- 数据很重要;
- 需要回滚;
- 更新频繁;
- 删除条件不容易完全确认。
等确认旧数据确实不再需要后,再定期做物理清理。
七、回滚时怎么做
如果新版本上线后发现结果不准,可以按下面方式回滚:
- 把新版本状态改为
inactive; - 把旧版本状态恢复为
active; - 重新加载或刷新搜索逻辑;
- 用固定问题集验证结果;
- 记录回滚原因。
回滚能不能顺利,取决于你是否保留了旧版本数据和导入日志。
FAQ
Q1:更新数据时一定要删除旧数据吗?
A:不一定。可以先使用版本字段和状态字段控制是否参与检索,确认无误后再清理旧数据。
Q2:软删除会不会占用空间?
A:会占用一定存储,但它更安全。可以定期清理长期不用的 inactive 数据。
Q3:为什么要保留导入日志?
A:导入日志可以帮助追踪数据来源、切分规则、模型版本和写入批次,是回滚和排错的重要依据。

