目录
为什么向量距离计算方式是内积时,搜索出来的 top1 不是目标向量本身?
对集合分区的查询是否会受到集合大小的影响,尤其在集合数据量高达一亿数据量时?
如果只是搜索集合中的部分分区,整个集合的数据会全部加载到内存吗?
对各个数据段的检索是并行处理的吗?
Milvus 中如何选择向量索引的类型?
Milvus 可以在同一个集合中的不同分区上建立不同索引吗?
Milvus 中支持新增向量后再建索引吗?
索引 IVF_SQ8 和 IVF_SQ8H 在召回率上有区别吗?
Milvus 中 FLAT 索引和 IVF_FLAT 索引的原理比较?
创建索引立即查询,为什么内存会突然增长?
建立集合后,index_file_size 和 metric_type 还支持修改吗?
向量插入后自动落盘间隔时间是多少?
如果设置了 preload_collection,必须是等集合全部加载到内存,服务才能访问吗?
为什么向量距离计算方式是内积时,搜索出来的 top1 不是目标向量本身?
向量距离计算方式用内积时,如果向量未归一化,会出现这样的情况。
对集合分区的查询是否会受到集合大小的影响,尤其在集合数据量高达一亿数据量时?
不会。如果你在搜索时指定了分区,Milvus 只会在相应分区进行搜索。
如果只是搜索集合中的部分分区,整个集合的数据会全部加载到内存吗?
不会,只加载指定的分区里的数据。
对各个数据段的检索是并行处理的吗?
一般而言,Milvus 对单个数据段内的查询是并行的,多个数据段的处理根据发行版本略有不同。
假设一个集合存在多个数据段,当查询请求到达时:
- CPU 版 Milvus 会对数据段读取任务和段内查询任务进行流水线处理。
- GPU 版 Milvus 会在 CPU 版的基础上,将多个数据段分配给各个 GPU 处理。
可参阅文章:Milvus 开源向量数据库 ANNS。
Milvus 中如何选择向量索引的类型?
索引需要根据具体场景和需求去选择。详见 如何选择索引类型。
Milvus 可以在同一个集合中的不同分区上建立不同索引吗?
不可以。同一个集合在某一刻只能有一种索引。
Milvus 中支持新增向量后再建索引吗?
支持。Milvus 中数据是分文件存储的,后续新增向量会存在新的数据文件中。该文件达到一定量后会自动触发建立索引,生成一个新的索引文件,不会影响之前已经建立过的索引。
索引 IVF_SQ8 和 IVF_SQ8H 在召回率上有区别吗?
对于相同的数据集,IVF_SQ8 和 IVF_SQ8H 的召回率一致。
Milvus 中 FLAT 索引和 IVF_FLAT 索引的原理比较?
把 FLAT 和 IVF_FLAT 做比较,可以这么估算:
已知 IVF_FLAT 索引是把向量分成 nlist 个单元。假设用默认的 nlist = 16384,搜索的时候是先用目标向量和这 16384 个中心点计算距离,得到最近的 nprobe 个单元,再在单元里计算最近向量。而 FLAT 是每条向量和目标向量计算距离。
所以当总的向量条数约等于 nlist 时,两者的计算量相当,性能也差不多。而随着向量条数达到 nlist 的 2 倍、3 倍、n 倍之后,IVF_FLAT 的优势就越来越大。
可参阅 如何选择索引类型。
创建索引立即查询,为什么内存会突然增长?
这是因为 Milvus 在进行搜索时会将新生成的索引文件加载到内存,由于加载的索引文件和用于生成索引文件的原始向量文件总和小于 cache.cache_size 的上限,原始向量数据暂未被系统从内存释放。
建立集合后,index_file_size 和 metric_type 还支持修改吗?
不支持。
向量插入后自动落盘间隔时间是多少?
1 秒。
如果设置了 preload_collection,必须是等集合全部加载到内存,服务才能访问吗?
是的。如果是在 server_config.yaml 里设置的,那在启动 Milvus 时就会加载好数据后才开始提供服务。