AUTOINDEX
为满足用户不同需求,Zilliz Cloud 提供 2 种类型的集群 CU:性能型和容量型。但是,为不同类型 CU 集群中的 Collection 创建索引时,通常需要根据所选择的 CU 类型调整索引参数。为了方便创建索引,免去调节参数的麻烦,Zilliz Cloud 使用 AUTOINDEX 的索引类型。
AUTOINDEX 是Zilliz Cloud 独有的索引类型,可以帮助获取最佳搜索性能。当在 Zilliz Cloud 上为 Collection 中的向量字段创建索引时,会自动应用 AUTOINDEX 索引。
特性与收益
相对于开源的 Milvus 提供的能力而言,AUTOINDEX 有着显著的性能优势。根据一项基准测试结果,在特定的数据集上,AUTOINDEX 的 QPS 是其它索引类型的 3 倍。
AUTOINDEX 可以在如下场景中提供较高性能:
- 使用单指令流多数据流(SIMD)的方式加速查询和存储,从而进一步提升服务器性能。
- 优化数据图和裁切策略,显著降低检索时需要访问的数据点。
- 实现动态量化策略,减少距离计算开销。
同样成本,更高收益
根据用户对存储容量和检索性能的不同需求,AUTOINDEX 支持纯内存检索、磁盘混合检索及内存映射检索等多种检索模式。在纯内存检索模式下,AUTOINDEX 使用动态量化技术显著降低内存使用。在磁盘混合检索模式下,AUTOINDEX 动态缓存数据,并使用算法减少 I/O 操作,从而保持高性能。
自动调优
近似最近邻(ANN)算法要求在召回率和性能之间做出取舍。查询参数的设置对检索结果影响巨大。如果检索参数确定召回范围过小,可能会导致极低的召回率,达不到业务要求。反之而言,如果检索参数确定的召回范围过大,查询性能则会极速降低。
选择合适的查询参数需要掌握相关领域的知识,对用户来说,学习曲线过高。为了降低用户的学习曲线,AUTOINDEX 实现了一套智能算法,通过在建立索引时分析用户数据的分布情况,使用机器学习模型自动选择检索参数,实现召回率和检索性能间的平衡。这样一来,用户就无需手动设置检索参数了。
创建索引和向量搜索
创建索引是指将 Collection 中的 Entity 按照特定顺序进行排序,以提高搜索效率。
在 Zilliz Cloud 上为向量字段创建索引十分简单。只需将索引类型设置为 AUTOINDEX
,然后选择相似度类型即可。Zilliz Cloud 将自动选择最合适配置。因此,只需要考虑相似度类型,选择如何测量向量间距离。
集群、Collection 及 Entity
Zilliz Cloud 集群由全托管 Milvus 实例及相关计算资源构成。可以在 Zilliz Cloud 集群中创建 Collection,然后在 Collection 中插入 Entity。Zilliz Cloud 集群中的 Collection 类似于关系型数据库中的表。Collection 中的 Entity 类似于表中的记录。
集群
在 Zilliz Cloud 上创建集群时,需要选择集群 CU 类型。CU 类型有 2 种选项:性能型和容量型。
确定 CU 类型后,还需要选择 CU 大小。CU 大小决定了集群可容纳的 Collection 数量。在 Dedicated 集群中,每个计算单元(CU)可最多容纳 64 个 Collection,并且每个集群中的 Collection 总数不能超过 4096。
集群中的所有 Collection 共享 CU 资源。为节省 CU 资源,推荐将不再使用的 Collection 从 CU 中释放出来。Collection 被释放后,其中的数据被转移到磁盘存储,从而可以释放 CU 资源以供其他已加载的 Collection 使用。需要查询已被卸载的 Collection 时,可以将其重新加载至内存中。请注意,Collection 加载需要等待一段时间,因此不推荐频繁卸载和加载 Collection。
Collection
Collection 是一张二维数据表,包含固定列数和可变行数。Collection 数据表中的每 1 列对应 1 个字段,每 1 行表示 1 个 Entity。
字段
通常会根据属性(如大小、重量、位置等)描述对象。对象属性类似于 Collection 中的字段。
Collection 中,主键是最特殊的字段,每个主键字段的值唯一且不重复。每 1 个主键都可以对应 Collection 中的 1 条 Entity 记录。
Schema
每个字段都具有自己的属性,字段中数据类型和相关限制(如向量维度和相似性类型)。通过定义字段及顺序,Collection 会有 1 个 Schema,也就是 1 个数据结构框架。Collection Schema 类似于传统数据表的结构。
Zilliz Cloud 支持以下数据类型:
- 布尔值(BOOLEAN)
- 双精度浮点数(DOUBLE)
- 单精度浮点数(FLOAT)
- 浮点向量(FLOAT_VECTOR)
- 8 位有符号整数(INT8)
- 32 位有符号整(INT32)
- 64 位有符号整(INT64)
- 可变长度字符串(VARCHAR)
- JSON
Zilliz Cloud 提供 3 种 CU 类型。不同 CU 类型适用于不同的场景,搜索性能也有所不同。
Zilliz Cloud 集群中仅 FLOAT_VECTOR 支持向量的数据类型。
索引
与 Milvus 实例不同,Zilliz Cloud 集群仅支持 AUTOINDEX 索引。该索引类型针对 Zilliz Cloud 提供的 3 种 CU 进行了优化。
Partition
Partition 是从 Collection 中划分而来。Zilliz Cloud 支持将物理存储划分成若干部分,每一部分被称为一个 Partition。每个 Partition 都可以包含多个 Segment。
通过将 Entity 分别存入不同的 Partition,Zilliz Cloud 实现了对 Entity 的隔离与分组。在按 Partition 进行检索时,由于无须关注 Collection 中其它 Partition 的数据,检索效率得到了较大的提升。
Entity
Collection 中的 Entity 是指共享相同字段集的数据记录,如图书馆中的图书或基因组中的基因。存储在每个字段中的数据共同形成 1 个 Entity。
输入查询向量、选择相似性类型和过滤条件(可选)后,可以对 Collection 中的 Entity 进行向量搜索。例如,如果使用关键字 “Interesting Python demo” 进行搜索,Zilliz Cloud 会返回所有标题语义相似的的文章。在此过程中,搜索实际是在向量字段 title_vector 上执行的。
可以向 Collection 中添加任意数量的 Entity。但是,随着 Entity 数量和维度增加,Entity占用的内存大小也会增加,影响 Collection 的搜索性能。
Schema
定义 Schema 是指为数据库中数据创建一个清晰有序的数据结构。Schema 可以揭示和解列数据之间的关系。因此,定义 Schema 是为了了解数据集中的所有数据,展示数据间联系,从而用最有效的方式表示数据关系。
定义 Schema
在 Zilliz Cloud 集群中,不同 Collection 的 Schema 可能不同。正确定义数据模型以表示数据集的结构十分重要。定义数据模型时,需要考虑以下几个方面:
-
Entity
Collection 中的 Entity 类似于传统数据库表格中的行。Entity 的每个属性对应传统数据库表格中的列。向 Collection 插入数据前,请先观察 Entity 之间共享的属性。
例如,可以将书可以作为 Collection 中的 Entity,书的属性可以包括标题、作者、ISBN 和语言。
-
数据类型
Entity 的每个属性都有自己的数据类型。设置合适的数据类型以定义属性。
例如,标题的数据类型应为可变长度字符串(VarChar)。
-
Entity 属性值限制
不同的数据类型可能带有不同的限制。例如,向量字段对向量维数有限制、VarChar字段对字符的最大长度有限制。
需要花费一些时间来定义 Collection 的数据模型。当需要定义的数据属性特别多时,你需要花费的时间可能更多。因此,Zilliz Cloud 集群提供了动态和静态数据模型以满足不同需求。
动态数据列
1 个 Collection 可拥有 1 个主键字段和 1 个向量字段。可以在待插入数据中包含动态数据列,无需手动定义数据集中的 Entity 属性。简单来说,在创建 Collection 时输入 Collection 名称和向量维数,Zilliz Cloud 会自动根据后续插入的数据推断哪些数据将以键值对的形式存入名为 $meta 的保留字段中。
以下示例代码片段创建了 1 个名为 medium_articles 的 Collection,且为该 Collection 开启了动态数据列。
# Connect using a MilvusClient object
from pymilvus import MilvusClientCLUSTER_ENDPOINT="YOUR_CLUSTER_ENDPOINT" # Set your cluster endpoint
TOKEN="YOUR_CLUSTER_TOKEN" # Set your token# Initialize a MilvusClient instance
# Replace uri and API key with your own
client = MilvusClient(uri=CLUSTER_ENDPOINT, # Cluster endpoint obtained from the consoletoken=TOKEN # API key or a colon-separated cluster username and password
)# Create a collection
client.create_collection(collection_name="medium_articles",dimension=768
)
将 Entity 插入 Collection 时,Zilliz Cloud 将自动解析数据并将 Schema 中未定义的字段(也就是除了 id 和 vector 字段以外的其它字段)以键值对的形式存入一个名为 $meta 的保留字段。
client.insert(collection_name="medium_articles",data: {"id": 0,"title": "The Reported Mortality Rate of Coronavirus Is Not Important","ve