优化 Collection
optimize() 方法通过将临时 Flat 缓冲区中累积的向量构建为配置的向量索引来提升搜索性能。它在后台运行,不会阻塞读写,确保应用始终保持响应。
为什么需要优化
在 Zvec 中,新插入的向量不会直接添加到配置的向量索引中。
而是先追加到一个轻量级的 Flat(暴力搜索)索引缓冲区。
这种设计有重要的优势,但也有取舍:
- ✅ 优势
- 最大化写入吞吐量:实现高速数据写入。
- 流式插入:为不原生支持增量更新的索引类型(如 IVF)提供实时插入能力。
- ⚠️ 取舍
- 搜索随时间变慢:随着 Flat 缓冲区增长,搜索性能会下降。
🔁 解决方案
定期调用 optimize()。这会触发后台进程将缓冲区中的向量合并到配置的向量索引中——不会中断正在进行的读写操作。🚀
optimize() 是一个同步方法(优化完成后才返回),但它不会锁定 Collection。
其他线程可以继续读取、写入和查询而不受影响——应用始终保持完全响应。
使用示例
import zvec
collection = zvec.open(path="/path/to/my/collection")
# 插入一些 Document
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 的索引状态。 一般建议在未索引 Document 达到 100,000+ 条时考虑优化——但请根据具体场景调整。