向量库的变更不只有 insert。删除、按主键覆盖、按 TTL 过期,都会碰到同一套底层机制:先让搜索看不见,再在 compaction 中物理回收(第 8、10、11 篇)。本文按 2.6.x 用户文档钉语义,不写成 SDK 百科。
本文是「向量检索引擎」系列第 13 篇(共 18 篇)。→ 系列目录
版本锚定:Milvus 2.6.x Delete Entities、Upsert Entities、Set Collection TTL / Create Collection(TTL 属性)、Bitset。
一、Delete:过滤或主键
Delete Entities:可按 过滤表达式 或 主键 删除;也可限定 Partition。
- 过滤删除:适合「按属性批量删」(如某
color in [...])。 - 主键删除:适合「精确删几条」。
复杂过滤可用 Filter Templating 降低解析成本(第 11 篇)。Delete 走 DML 路径进入 Streaming / WAL(Architecture API 表),与 insert 一样进入时间戳与顺序体系。
1.1 软删:bitset
Bitset:删除信息紧凑存在段内 bitset;标记删除的实体在 search/query 不参与计算。Streaming Service 还写明 Query Delegator 负责向 Query Node 广播 Delete——历史段上的可见性靠删除传播,而不是立刻重写整图索引。
因此:
\[ \text{删除成功(逻辑)} \;\Rightarrow\; \text{后续搜索应不可见(在一致性水位满足时)} \]
但
\[ \text{对象存储字节回收} \;\Leftarrow\; \text{compaction 等后台过程(第 10 篇)} \]
两者不是同一时刻。
二、Upsert:insert 或 update
Upsert Entities:按请求中的主键是否已存在,决定插入新实体或更新已有实体。
2.1 Override 模式
官方:override 模式的 upsert 组合 insert 与 delete——对已存在主键,插入请求载荷中的新数据,并删除原主键对应旧实体。
若主键字段开启
autoID:请求仍须带目标实体主键以便定位;Milvus
用该主键定位待替换实体,并为载荷生成 新主键
再插入(官方说明)。这意味着 override 在 autoID
下不是「原地改同一主键行」的朴素想象,读文档示例时要对齐。
2.2 Merge 模式
官方还提供 merge 模式(与 override 相对):在已有实体上合并字段更新。具体字段级规则以 Upsert Entities 当前文档为准;本系列强调引擎后果——更新仍表现为日志上的变更 + 旧版本通过删除/合并语义退出搜索集,最终空间回收靠后台整理。
三、TTL:过期策略
Create Collection / Set Collection
TTL:通过属性
collection.ttl.seconds(整数秒)配置集合
TTL。数据超过 TTL 后由系统自动删除。
官方明确:
- 删除过程 异步;
- TTL 到期后,搜索/查询侧应不再返回过期实体(产品文档表述为过期后立即从结果中排除);
- 物理删除依赖后续 GC / compaction 周期,可能存在延迟。
因此 TTL 与手工 delete 共享同一类工程间隙:逻辑不可见 ≠ 磁盘立刻变小。容量规划不能假设「TTL=14 天则对象存储精确保持 14 天字节」。
若文档版本提及实体级 TTL 字段与集合级 TTL
互斥等扩展,以你部署的 minor 版本文档为准;本篇以 2.6 常用的
collection.ttl.seconds 为主。
四、与一致性、过滤的交叉
| 操作 | 与一致性 | 与过滤 |
|---|---|---|
| delete | 可见性受 GuaranteeTs 约束(第 12 篇) | delete 本身可用 filter |
| upsert | 新版本可见性同上 | 旧版本应退出结果集 |
| TTL | 过期后结果排除 | 常与业务「保留窗口」对齐 |
RAG 场景:文档撤回应用 delete + 足够一致性,不能只靠应用缓存失效而向量库仍返回旧块。
五、学术谱系、工程间隙、开放问题
5.1 谱系
软删 + 后台合并是 LSM/列存常见模式;向量引擎额外要求删除掩码进入 ANN 查询(Knowhere bitset),否则图游走仍可能返回已删近邻。
5.2 工程间隙
- 高频 upsert 产生大量 delete+insert,放大 WAL、compaction 与建索队列(第 5、10 篇)。
- autoID + upsert override 的主键轮换易让上层「按旧 ID 去重」逻辑翻车。
- TTL 异步回收导致监控「集合行数」与「对象体积」短期背离。
5.3 开放问题
- 删除广播延迟与多副本历史段的上界?
- upsert merge 与多向量字段部分更新的索引增量策略?
- TTL 与湖仓 snapshot 保留策略如何对齐同一业务日历?
六、小结
Delete/Upsert/TTL 首先改变 可见性(bitset / 过期过滤),其次才在 compaction 中回收空间。Upsert override 本质近 delete+insert。下一篇:副本、负载与故障恢复。
参考资料
- Milvus Documentation v2.6.x, Delete Entities、Upsert Entities。
- Milvus Documentation v2.6.x, Set Collection TTL
/ Create
Collection(
collection.ttl.seconds)。 - Milvus Documentation v2.6.x, Bitset、Streaming Service(Delete 广播)。
- 第 8、10、11、12 篇、系列 index。
返回 系列目录 | 上一篇:一致性模型 | 下一篇:副本与故障恢复
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【向量检索引擎】Knowhere:向量索引执行引擎与插件契约
按官方 Knowhere 文档说明其在 Milvus 中的位置、相对 Faiss 的扩展(bitset、SIMD 选择、二进制度量)、VecIndex 类层次与 IDMAP/IVF/HNSW 等类型,并与 db-frontier/08 的算法细节分工。
【向量检索引擎】Data Node:compaction 与 index build
说明 Milvus 2.6.x 中 Data Node 作为离线 Worker 如何承接 Coordinator 下发的建索引与 compaction,输入输出如何进出对象存储,以及索引堆积与 handoff 如何影响查询新鲜度与资源争用。
【向量检索引擎】混合检索与标量过滤:bitset、选择度与引擎落点
在 Milvus 引擎路径上落实 filtered ANN:表达式与 bitset 如何进入 Segcore/Knowhere,pre-filter/post-filter 在段级归并下的失效模式,以及对读 db-frontier/09 的 ACORN 争论而不重写算法全文。
【向量检索引擎】生产排障:召回、延迟、堆积、OOM
按症状反推到 Segment/索引/过滤/一致性/对象存储/副本的检查清单;只使用本系列已建立的机制,不伪造集群指标,区分金标准召回、水位等待与建索队列。