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 看命中条数与样例,确认后再删。