Zvec Logo

优化 Collection

optimize() 方法将 Flat 暂存区中累积的向量合并构建到配置的向量索引中,从而提升检索性能。该操作在后台运行不会阻塞读取或写入操作,从而确保应用程序始终保持响应。


为什么需要优化

在 Zvec 中,新插入的向量不会直接添加到已配置的向量索引中。这些新向量会先被暂存到一个轻量级的 Flat 索引 (暴力检索)缓冲区。

这种设计带来了显著的优势,但也伴随着一定的取舍:

  • 优势
    • 最大化写入吞吐量:实现高速数据写入。
    • 流式写入:为原生不支持流式增量更新的索引类型 (如 IVF),提供实时写入的能力。
  • ⚠️ 取舍
    • 搜索性能随写入量衰减:随着 Flat 暂存区增长,搜索性能会下降。

🔁 解决方案

定期调用 optimize()。这会触发后台工作线程,将暂存区中的向量合并到已配置的向量索引中 — 且不会中断正在进行的读写操作。🚀

optimize() 是一个同步方法 (仅在优化完成后才返回),但它不会锁定 collection
其他线程可以继续无感地读取、写入和查询 — 应用程序将保持完全响应。


使用示例

优化 collection
import zvec

collection = zvec.open(path="/path/to/my/collection")

# 插入一些 documents
for i in range(1000):
    doc = zvec.Doc(id=f"doc_{i}", vectors={"embedding": [i + 0.1, i + 0.2, i + 0.3]})
    collection.insert(doc)

# 优化 collection
collection.optimize()  

检查索引状态

使用 stats 属性获取 collection 索引状态的实时信息:

print(collection.stats)


何时调用 optimize()

定期执行优化,但不宜过于频繁

  • 频率过低 → Flat 缓冲区过大,导致检索性能下降
  • 频率过高 → 浪费资源,过早优化小批量数据

请根据您的数据写入速率查询延迟要求进行权衡。

最佳实践:
如果感觉检索速度变慢,请检查 collection 索引状态。
原则上,建议在未索引 documents 数量达到10万条以上时进行优化 — 但请务必根据您的具体业务场景灵活调整。

目录