- id: product_faq.md
- 产品常见问题
- Milvus 会收费吗?
- Milvus 支持非 x86 平台吗?
- Milvus 可以处理百亿或千亿级数据吗?
- Milvus 数据存储在哪里?
- 为什么我在 etcd 找不到向量数据?
- Milvus 的 Python SDK 有连接池吗?
- Milvus 是否支持 “边插入边查询” ?
- Milvus 允许插入重复 ID 的向量吗?
- 如果插入重复 ID(即 primary key)的向量,Milvus 是否会将其作为数据更新处理?
- Milvus 中自定义 ID (即 primary key)有没有长度限制?
- Milvus 中单次插入数据有上限吗?
- 搜索指定 partition 时,如果所在的 collection 大小发生变化,是否对查询性能有影响?
- 如果已指定仅搜索部分 partition,Milvus 会将整个 collection 的数据加载到内存吗?
- Milvus 支持新增向量后再建索引吗?
- Milvus 中 FLAT 索引和 IVF_FLAT 索引的原理比较?
- Milvus 的数据落盘逻辑是怎样的?
- 什么是归一化?Milvus 中为什么有时候需要归一化?
- 为什么欧氏距离和内积在计算向量相似度时的结果不一致?
- Milvus 对 collection 和 partition 的总数有限制吗?
- 为什么搜索
topk
条向量,但召回结果不足 k 条向量? - Milvus 支持的向量维度的最大值是多少?
- Milvus 是否支持 Apple M1 CPU?
- Milvus 支持何种 ID (即 primary key)field 数据类型?
- Milvus 支持扩缩容吗?
- 查询是否在内存中执行? 什么是增量数据和历史数据?
- Milvus 2.0 支持并行搜索吗?
- 为什么在对应的集合被删除后仍然保留 MinIO 中的数据?
- Milvus 是否支持 Pulsar 以外的消息引擎?
- 相似性搜索与结构性匹配有何区别?
- 仍有问题没有得到解答?
id: product_faq.md
产品常见问题
Milvus 会收费吗?
Milvus 会坚持开源路线,软件本身不会收取任何费用。
请遵循 Apache 2.0 协议 使用 Milvus 开源项目。
对于不愿意自行搭建和维护 Milvus 分布式实例的用户,Zilliz 也提供全托管式平台 Zilliz Cloud,允许用户根据实际使用服务付费,数据可靠性由云平台负责管理。
Milvus 支持非 x86 平台吗?
Milvus 暂不支持非 x86 平台。
为保证 Milvus 的正常运行,你的 CPU 须支持以下任一指令集:SSE4.2、AVX、AVX2、AVX512。这些均为 x86 平台专用的 SIMD 指令集。
Milvus 可以处理百亿或千亿级数据吗?
理论上来说,Milvus 能够处理的数据规模取决于用户自身的硬件条件,其中有两大关键指标,即系统内存容量和持久化存储空间容量。
- 执行查询操作前,Milvus 需先将所有指定的 collection 或 partition 加载到内存。因此,内存容量决定了 Milvus 可查询数据的上限。
- 执行插入操作时,Milvus 需先将所有的 entity 以及 collection 相关的 schema (当前仅支持 MinIO 作为持久化存储)全部写入持久化存储。因此,持久化存储空间的容量决定了 Milvus 可插入数据的上限。
Milvus 数据存储在哪里?
Milvus 包含两部分数据:用户插入的数据和元数据。
用户插入的数据以增量日志的方式存储在持久化存储上(当前仅支持 MinIO 作为持久化存储),包括向量数据、标量数据以及 collection 相关 schema 等。
每个 Milvus 模块都会产生各自的元数据,存储在 etcd 中。
为什么我在 etcd 找不到向量数据?
etcd 只用于存放 Milvus 系统的元数据,entity 存储在 MinIO 中。
Milvus 的 Python SDK 有连接池吗?
Milvus v0.9.0 及更高版本对应的 Python SDK 有连接池。连接池的连接数量没有上限。
Milvus 是否支持 “边插入边查询” ?
支持。插入操作和查询操作由两个相互独立的模块分开执行,因此互不影响。对于客户端,插入数据进入消息队列即意味着该插入操作结束,尽管此时的数据可能还无法被查询到。只有加载到 query node 的数据才能被用户查询到。若插入的 segment 的大小未满足构建索引的阈值(默认值为 512 MB),Milvus 将使用暴搜,这种情况下的查询性能会受到一定影响。
Milvus 允许插入重复 ID 的向量吗?
允许,Milvus 不会对向量 ID(即 primary key)进行去重。
如果插入重复 ID(即 primary key)的向量,Milvus 是否会将其作为数据更新处理?
目前,Milvus 的去重功能无法保证插入新数据会覆盖与其 pk
相同的旧数据。因此,当前版本中基于相同 pk
的结构化匹配的返回结果为未知行为。该限制将在未来版本中修复。
Milvus 中自定义 ID (即 primary key)有没有长度限制?
Entity ID (即 primary key)必须是非负的 64 位整型。
Milvus 中单次插入数据有上限吗?
因 gRPC 限制,单次插入数据不能超过 1024 MB。
搜索指定 partition 时,如果所在的 collection 大小发生变化,是否对查询性能有影响?
不会。如果你在搜索时指定了 partition,Milvus 只会在相应 partition 进行搜索。
如果已指定仅搜索部分 partition,Milvus 会将整个 collection 的数据加载到内存吗?
不会。查询前需先保证数据已加载到内存。
- 如果明确知道当前数据所在 partition,可直接调用
load_partition()
方法加载指定 partition 的数据,然后调用search()
方法并指定该 partition。 - 如果不确定数据所在 partition,那么在调用
search()
方法前需先调用load_collection()
方法。 - 如果未在查询前加载 collection 或 partition 数据,Milvus 会报错。
Milvus 支持新增向量后再建索引吗?
支持。调用 create_index()
方法后,Milvus 会为后续新增向量自动构建索引的任务。每当新增数据量达到一个完整的 segment 时即触发这一任务,Milvus 为新插入的向量构建索引。
新增向量的索引文件与前期构建的索引文件相互独立。
Milvus 中 FLAT 索引和 IVF_FLAT 索引的原理比较?
IVF_FLAT 索引将向量空间分成 nlist
个聚类单元。假设以默认值 nlist
= 16,384 搜索,Milvus 会先比较这 16384 个单元的中心与目标向量之间的距离,得出最近的 nprobe
个单元,接着比较这些单元内所有向量距离,得到最接近的向量。
FLAT 则计算每条向量和目标向量之间的距离。
当向量总条数约等于 nlist
时,两者的计算量相当,无明显性能差距。然而,随着向量条数达到 nlist
的 2 倍、3 倍、n 倍之后,IVF_FLAT 的性能优势就越来越突出。
可参阅 向量索引。
Milvus 的数据落盘逻辑是怎样的?
新增数据写入消息队列后,Milvus 即返回插入成功,表示当前插入操作已经结束,但是此时数据并未落盘。Milvus 系统的 data node 负责将消息队列中的数据以增量日志的方式写入持久化存储;如果调用 flush()
方法,也会迫使 data node 立刻将当前消息队列的所有数据写入持久化存储。
什么是归一化?Milvus 中为什么有时候需要归一化?
归一化指通过数学变换将向量的模长变为 1 的过程。如需使用点积计算向量相似度,则必须对向量作归一化处理。处理后点积与余弦相似度等价。
可参阅文章 向量搜索的简明数学基础。
为什么欧氏距离和内积在计算向量相似度时的结果不一致?
根据数学原理,对于已经归一化的向量数据,用欧氏距离和内积分别计算向量相似度,其返回的结果是一致的。
如果用欧氏距离和内积计算向量相似度返回的结果不一致,需要检查向量数据是否已经归一化。
Milvus 对 collection 和 partition 的总数有限制吗?
Milvus 对 collection 数量没有限制,但每个 collection 内的 partition 数量不能超过参数 master.maxPartitionNum
所设定的值。
为什么搜索 topk
条向量,但召回结果不足 k 条向量?
在 Milvus 支持的索引类型中,IVF_FLAT 和 IVF_SQ8 是基于 k-means 空间划分的分单元搜索算法。空间被分为 nlist
个单元,导入的向量被分配存储在基于 nlist
划分的文件结构中。Milvus 计算出距离最近的 nprobe
个单元,比较目标向量与选定单元中所有向量之间的距离,以返回最终结果。
如果 nlist
和 topk
比较大,而 nprobe
又足够小,就有可能出现 nprobe
个单元中的所有向量总数小于 k 的情况,导致返回结果不足 k 条向量。
想要避免这种情况,可以尝试将 nprobe
设置为更大值,或者把 nlist
和 topk
设置为更小值。
详见 向量索引。
Milvus 支持的向量维度的最大值是多少?
Milvus 最多支持 32768 维向量。
Milvus 是否支持 Apple M1 CPU?
当前版本 Milvus 暂不支持 Apple M1 CPU。
Milvus 支持何种 ID (即 primary key)field 数据类型?
在当前版本中,Milvus 仅支持 INT64 数据型。未来的 2.0 正式版将会同时支持 INT64 和 string 数据型。
Milvus 支持扩缩容吗?
支持。你可以通过 Helm Chart 在 Kubernetes 上部署多节点 Milvus 集群。更多相关说明,参考 扩缩容指南。
查询是否在内存中执行? 什么是增量数据和历史数据?
是的。当收到查询请求时,Milvus 会将增量数据和历史数据共同加载至内存后进行搜索。增量数据来自尚未达到持久化阈值而缓存在内存中的 growing segment,而历史数据则来自已经持久化在对象存储中的 sealed segment。增量数据和历史数据共同构成了要搜索的整个数据集。
Milvus 2.0 支持并行搜索吗?
支持。 对于同一个集合上的查询,Milvus 会并行查询增量数据和历史数据,而对不同集合上的查询则是串行的。但由于历史数据可能是一个非常庞大的数据集,对历史数据的搜索相对更耗时,所以本质上是串行的。 Milvus 2.0 的正式版将改进这个问题。
为什么在对应的集合被删除后仍然保留 MinIO 中的数据?
为了方便数据回滚,MinIO 中的数据被设计为保留一定时间。
Milvus 是否支持 Pulsar 以外的消息引擎?
未来 Milvus 2.0 将支持 Kafka。
相似性搜索与结构性匹配有何区别?
在 Milvus 中,向量相似度搜索是通过计算向量相似度以及向量索引的加速来检索向量。与搜索不同,向量结构性匹配是通过标量过滤来匹配检索向量。布尔表达式通过过滤标量 field 或 primary key field,检索并返回所有与之匹配的结果。 结构性匹配不涉及相似性计算以及向量索引。
仍有问题没有得到解答?
如果仍有其他问题,你可以: