首页/AI/RAG 与向量库速查/Milvus 删除与压缩(compaction)

Milvus 删除与压缩(compaction)

Milvus 删除是标记删除:数据先对查询不可见,随后由 compaction 合并段并物理清理;频繁删除写入的场景要关注段数量与磁盘占用,必要时手动触发 compaction。

RAG 与向量库速查AI更新于 2026-10-13

Milvus 删除与压缩是什么

Milvus 的删除是标记删除:调用 delete 后,数据对查询立即不可见,但磁盘上原来的段仍保留这些行,随后由后台 compaction(段合并与清理)把数据物理清掉。写入与删除都频繁的场景里段数量会持续膨胀,检索要扫描的段变多、磁盘空间不回收,因此需要关注段状态,并在大规模清理后手动触发一次 compaction。整个过程是异步的:触发后拿到 job id,再轮询状态确认完成。

基本信息

适用版本Milvus 2.x(pymilvus 客户端)
删除方式按主键 delete(ids) 或按表达式 delete(filter)
可见性删除后立即对查询不可见
物理清理由 compaction 完成,异步执行
手动触发client.compact(collection_name=...)
进度观测get_compaction_state(job_id)、get_collection_stats()

典型使用场景

  • 下架过期文档:手册改版后删掉旧版本切片,避免检索到废弃内容
  • 修复性重灌:某批数据切分错误,先删该来源再重新写入
  • 按来源批量清理:某个数据源停止接入后一次性清空
  • 日常维护:删除量大时观察段数量与待压缩任务,择机触发压缩
  • 合规删除:需要物理清除时必须确认 compaction 已完成

按表达式删除与压缩

按表达式删除与压缩
client.delete(collection_name="kb", filter='source == "old-manual"')  # 标记删除

job = client.compact(collection_name="kb")      # 大规模清理后手动触发
print(job)                                       # 拿到压缩任务 id
print(client.get_compaction_state(job))          # 轮询任务状态
print(client.get_collection_stats("kb"))         # 查看集合统计

调用逐项读法

调用作用注意点
delete(filter=…)按表达式标记删除表达式字段与 schema 不匹配会直接报错,删除前先用 query 统计命中条数
compact()触发段合并与物理清理异步执行,返回任务 id
get_compaction_state()查询压缩进度长时间未完成要查磁盘余量与后台负载
get_collection_stats()集合统计数据行数口径可能包含已标记删除的数据,需按官方说明理解
删除后磁盘占用不会立刻下降,这是标记删除的正常表现;写入密集期避免频繁手动 compaction,以免与写入抢资源。
删除表达式写错范围是高风险操作:先执行同条件的 query 看命中条数与样例,确认后再删。

易错点

  • 删除后长期不做压缩:段数量持续膨胀,检索延迟上升且磁盘空间不回收
  • 高峰时段手动触发 compaction:与写入争抢资源,查询延迟出现明显抖动
  • 把标记删除当成物理删除:合规审计时数据仍可从段文件中恢复读出
  • 用错删除表达式(字段类型不匹配、条件写反):一次误删整批数据,事后只能重灌

数据来源与参考

  • Milvus 官方文档(Delete Entities / Compact Data)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌