跳到主要内容

产品常见问题解答

Milvus 的价格是多少?

Milvus 是一个完全免费的开源项目。

在生产或分发 Milvus 时,请遵守 Apache 许可证 2.0

负责 Milvus 的公司 Zilliz 还为那些不想构建和维护自己的分布式实例的用户提供了一个完全托管的云版本平台。Zilliz Cloud 自动维护数据可靠性,并允许用户按实际使用量付费。

Milvus 是否支持非 x86 架构?

Milvus 无法安装或在非 x86 平台上运行。

您的 CPU 必须支持以下指令集之一才能运行 Milvus:SSE4.2、AVX、AVX2、AVX512。这些都是专为 x86 架构设计的 SIMD 指令集。

Milvus 能处理的最大数据集大小是多少?

从理论上讲,Milvus 能处理的最大数据集大小取决于其运行的硬件,具体来说是系统内存和存储:

  • Milvus 在运行查询之前将所有指定的集合和分区加载到内存中。因此,内存大小决定了 Milvus 可以查询的数据量的最大值。
  • 当向 Milvus 添加新实体和与集合相关的模式(目前仅支持 MinIO 进行数据持久化)时,系统存储确定了可插入数据的最大允许大小。

Milvus 将数据存储在哪里?

Milvus 处理两种类型的数据,即插入数据和元数据。

插入数据,包括向量数据、标量数据和特定于集合的模式,以增量日志的形式存储在持久性存储中。Milvus 支持多个对象存储后端,包括 MinIOAWS S3Google Cloud Storage(GCS)、Azure Blob Storage阿里云 OSS腾讯云对象存储(COS)。

元数据是在 Milvus 中生成的。每个 Milvus 模块都有自己的元数据,这些元数据存储在 etcd 中。

为什么 etcd 中没有向量数据?

etcd 存储 Milvus 模块的元数据;MinIO 存储实体。

Milvus 是否支持同时插入和搜索数据?

是的。插入操作和查询操作由两个相互独立的模块处理。从客户端的角度来看,当插入的数据进入消息队列时,插入操作就完成了。然而,在加载到查询节点之前,插入的数据是无法被搜索的。如果段的大小未达到构建索引的阈值(默认为512 MB),Milvus会采用蛮力搜索,查询性能可能会降低。

在Milvus中可以插入具有重复主键的向量吗?

可以。Milvus不会检查向量主键是否重复。

当插入具有重复主键的向量时,Milvus会将其视为更新操作吗?

不会。Milvus目前不支持更新操作,也不会检查实体主键是否重复。您需要确保实体主键是唯一的,如果不是,Milvus可能会包含具有重复主键的多个实体。

如果出现这种情况,查询时将返回哪个数据副本是一个未知行为。这个限制将在未来的版本中修复。

自定义实体主键的最大长度是多少?

实体主键必须是非负64位整数。

每次插入操作可以添加的数据量的最大值是多少?

插入操作的大小不能超过1,024 MB。这是gRPC强加的限制。

集合大小是否会影响在特定分区搜索时的查询性能?

不会。如果指定了搜索的分区,Milvus只会搜索指定的分区。

当为搜索指定分区时,Milvus是否会加载整个集合?

不会。Milvus的行为各不相同。在搜索之前必须将数据加载到内存中。

  • 如果您知道数据位于哪些分区,请在search()方法调用中调用load_partition()来加载预期的分区,然后指定分区。
  • 如果您不知道确切的分区,请在调用search()之前调用load_collection()
  • 如果在搜索之前未加载集合或分区,Milvus将返回错误。

在插入向量后是否可以创建索引?

可以。如果通过create_index()为集合构建了索引,Milvus将自动为随后插入的向量构建索引。但是,Milvus直到新插入的向量填满整个段并且新创建的索引文件与之前的索引文件分开时才会构建索引。

FLAT和IVF_FLAT索引有什么不同?

IVF_FLAT 索引将向量空间划分为列表簇。在默认列表值 16,384 的情况下,Milvus 比较目标向量与所有 16,384 个簇的质心之间的距离,以返回探测到的最近簇。然后 Milvus 比较目标向量与所选簇中的向量之间的距离,以获取最近的向量。与 IVF_FLAT 不同,FLAT 直接比较目标向量与每个其他向量之间的距离。

当向量总数大约等于 nlist 时,IVF_FLAT 和 FLAT 在计算需求和搜索性能方面的差距很小。然而,当向量数量超过 nlist 两倍或更多时,IVF_FLAT 开始展现出性能优势。

详细信息请参阅 Vector Index

Milvus 如何刷新数据?

当插入的数据加载到消息队列时,Milvus 返回成功。但是,数据尚未刷新到磁盘。然后 Milvus 的数据节点将消息队列中的数据以增量日志的形式写入持久存储。如果调用 flush(),数据节点将被强制立即将消息队列中的所有数据写入持久存储。

什么是归一化?为什么需要归一化?

归一化是指将向量转换为其范数等于 1 的过程。如果使用内积来计算向量相似度,则必须对向量进行归一化。归一化后,内积等于余弦相似度。

详细信息请参阅 Wikipedia

为什么欧氏距离(L2)和内积(IP)会返回不同的结果?

对于归一化向量,欧氏距离(L2)在数学上等价于内积(IP)。如果这些相似度度量返回不同的结果,请检查您的向量是否已归一化。

Milvus 中的集合和分区总数是否有限制?

是的。您可以在 Milvus 实例中创建多达 65,535 个集合。在计算现有集合数量时,Milvus 会统计所有具有分片和分区的集合。

例如,假设您已经创建了 100 个集合,其中 60 个集合有 2 个分片和 4 个分区,其余 40 个集合有 1 个分片和 12 个分区。当前集合数量可以计算为:

60 * 2 * 4 + 40 * 1 * 12 = 960

在搜索 topk 向量时为什么会获得少于 k 个向量?

在 Milvus 支持的索引中,IVF_FLAT 和 IVF_SQ8 实现了 k-means 聚类方法。数据空间被划分为 nlist 个簇,并且插入的向量被分配到这些簇中。然后 Milvus 选择 nprobe 个最近簇,并比较目标向量与所选簇中所有向量之间的距离,以返回最终结果。 如果 nlisttopk 很大,而 nprobe 很小,那么 nprobe 簇中的向量数量可能会少于 k。因此,在搜索 topk 个最近向量时,返回的向量数量会少于 k

为了避免这种情况,尝试将 nprobe 设置得更大,而将 nlistk 设置得更小。

更多信息请参阅向量索引

Milvus 支持的最大向量维度是多少?

Milvus 默认支持最多 32,768 维的向量。您可以增加 Proxy.maxDimension 的值以支持更大维度的向量。

Milvus 是否支持 Apple M1 CPU?

当前的 Milvus 版本不支持 Apple M1 CPU。

Milvus 在主键字段上支持哪些数据类型?

在当前版本中,Milvus 支持 INT64 和字符串两种数据类型。

Milvus 是否支持可扩展性?

是的。您可以通过 Kubernetes 上的 Helm Chart 部署多节点的 Milvus 集群。请参阅扩展指南以获取更多指导。

查询是否在内存中执行?增量数据和历史数据是什么?

是的。当查询请求到来时,Milvus 通过将增量数据和历史数据加载到内存中来进行搜索。增量数据位于不断增长的段中,在达到持久化存储引擎的阈值之前,会在内存中进行缓冲,而历史数据来自存储在对象存储中的封存段。增量数据和历史数据共同构成了整个要搜索的数据集。

Milvus 是否支持并发搜索?

是的。对于同一集合的查询,Milvus 同时搜索增量数据和历史数据。然而,对于不同集合的查询是按顺序进行的。尽管历史数据可能是一个非常庞大的数据集,但对历史数据的搜索相对耗时,基本上是按顺序执行的。

在删除相应集合后,为什么 MinIO 中的数据仍然保留?

MinIO 中的数据设计为在一定时间内保留,以方便数据回滚。

Milvus 是否支持除 Pulsar 外的其他消息引擎?

是的。Milvus 2.1.0 版本支持 Kafka。

搜索和查询之间有什么区别?

在 Milvus 中,向量相似性搜索是基于相似性计算和向量索引加速来检索向量的。与向量相似性搜索不同,向量查询通过基于布尔表达式的标量过滤来检索向量。布尔表达式在标量字段或主键字段上进行过滤,并检索所有与过滤条件匹配的结果。在查询中,既不涉及相似性度量,也不涉及向量索引。

为什么 Milvus 中的浮点向量值精度为 7 位小数?

Milvus支持将向量存储为Float32数组。Float32值的精度为7位小数。即使使用Float64值,例如1.3476964684980388,Milvus也会将其存储为1.347696。因此,当您从Milvus检索这样的向量时,Float64值的精度会丢失。

Milvus如何处理向量数据类型和精度?

Milvus支持Binary、Float32、Float16和BFloat16向量类型。

  • 二进制向量:将二进制数据存储为0和1的序列,用于图像处理和信息检索。
  • Float32向量:默认存储精度约为7位小数。即使使用Float64值,也会以Float32精度存储,可能导致检索时精度丢失。
  • Float16和BFloat16向量:提供降低的精度和内存使用。Float16适用于带宽和存储有限的应用,而BFloat16在平衡范围和效率方面表现良好,常用于深度学习中减少计算需求而不显著影响准确性。

仍有疑问吗?

您可以:

  • 查看在GitHub上的Milvus。欢迎提出问题、分享想法并帮助他人。
  • 加入我们的Slack社区,寻求支持并与我们的开源社区互动。