Milvus的集合(Collection)类似MYSQL的表,用于组织数据,由一个或多个分区组成。
创建集合
一个集合由一个或多个分区组成。在创建新集合时,Milvus会创建一个名为_default
的默认分区。详细信息请参见术语解释 - 集合相关部分。
下面的示例将创建一个名为book
的两个分区的集合,其中包括一个名为book_id
的主键字段,一个名为word_count
的INT64
标量字段和一个名为book_intro
的二维浮点向量字段。实际应用程序往往会使用比示例更高维度的向量。
准备模式
模式类似MYSQL表结构定义。
要创建的集合必须包含一个主键字段和一个向量字段。主键字段支持INT64和VarChar数据类型。
首先,准备必要的参数,包括字段模式、集合模式和集合名称。
在定义集合模式之前,为集合中的每个字段创建一个模式。为了减少数据插入中的复杂性,Milvus允许您为每个标量字段指定一个默认值(除主键字段外)。这意味着,如果您在插入数据时将某个字段留空,将使用在字段模式创建期间配置的默认值。
from pymilvus import CollectionSchema, FieldSchema, DataType
book_id = FieldSchema(
name="book_id",
dtype=DataType.INT64,
is_primary=True,
)
book_name = FieldSchema(
name="book_name",
dtype=DataType.VARCHAR,
max_length=200,
default_value="Unknown" # 默认值为"Unknown"
)
word_count = FieldSchema(
name="word_count",
dtype=DataType.INT64,
default_value=9999 # 默认值为9999
)
book_intro = FieldSchema(
name="book_intro",
dtype=DataType.FLOAT_VECTOR,
dim=2
)
schema = CollectionSchema(
fields=[book_id, book_name, word_count, book_intro],
description="Test book search", # 描述为"测试图书搜索"
enable_dynamic_field=True # 启用动态模式
)
collection_name = "book"
模式类型 | 参数 | 描述 | 选项 |
---|---|---|---|
FieldSchema |
name |
要创建的字段的名称。 | N/A |
dtype |
要创建的字段的数据类型。 | 主键字段: - DataType.INT64 (numpy.int64) - DataType.VARCHAR (VARCHAR) 标量字段: - DataType.BOOL (Boolean) - DataType.INT8 (numpy.int8) - DataType.INT16 (numpy.int16) - DataType.INT32 (numpy.int32) - DataType.INT64 (numpy.int64) - DataType.FLOAT (numpy.float32) - DataType.DOUBLE (numpy.double) - DataType.VARCHAR (VARCHAR) - DataType.JSON (JSON) 向量字段: - BINARY_VECTOR (Binary vector) - FLOAT_VECTOR (Float vector) |
|
is_primary |
控制字段是否为主键字段的开关。主键字段需要指定此参数。 | True 或 False |
|
auto_id |
开启或关闭自动ID(主键)分配的开关。主键字段需要指定此参数,默认为False 。 |
True 或 False |
|
max_length (VARCHAR字段必填) |
允许插入的字符串的最大长度。 | [1, 65,535] | |
default_value |
字段的默认值。此参数仅适用于非数组和非JSON标量字段。无法为主键字段指定默认值。有关更多信息,请参阅参数default_value。 | N/A | |
dim (向量字段必填) |
向量的维度。 | [1, 32,768] | |
description (可选) |
字段的描述。 | N/A | |
CollectionSchema |
fields |
要创建的集合的字段。 | N/A |
description (可选) |
要创建的集合的描述。 | N/A | |
enable_dynamic_field |
是否启用动态模式。数据类型: Boolean (true 或 false )。可选,默认为False 。有关动态模式的详细信息,请参考动态模式和管理集合的用户指南。 |
||
collection_name |
要创建的集合的名称。 | N/A |
创建带有模式的集合
然后,使用上面指定的模式创建一个集合。
from pymilvus import Collection
collection = Collection(
name=collection_name,
schema=schema,
using='default',
shards_num=2
)
参数 | 描述 | 选项 |
---|---|---|
using (可选) |
在这里指定服务器的别名,可以选择在哪个Milvus服务器上创建集合。 | N/A |
shards_num (可选) |
要创建的集合的分片数。 | [1,16] |
num_partitions (可选) |
要创建的集合的逻辑分区数。 | [1,4096] |
*kwargs: collection.ttl.seconds (可选) |
集合的存活时间为集合的过期时间。过期的集合中的数据将被清理,并且将不参与搜索或查询。以秒为单位指定TTL。 | 值应为0或更大。0表示禁用TTL。 |
限制
资源配置
功能 | 最大限制 |
---|---|
集合名称长度 | 255个字符 |
集合中的分区数 | 4,096 |
集合中的字段数 | 64 |
集合中的分片数 | 16 |
default_value
参数
default_value
仅适用于非数组和非JSON标量字段。default_value
不适用于主键。default_value
的数据类型必须与dtype
中指定的数据类型相同。否则,可能会发生错误。- 在使用
auto_id
的情况下,不允许将所有剩余字段都设置为使用默认值。也就是说,在执行插入或更新操作时,您至少需要指定一个字段的值。否则,可能会发生错误。
重命名集合
如果您想要重命名一个集合,您可以使用集合重命名API与Milvus进行交互。本指南将帮助您了解如何使用您选择的SDK来重命名现有集合。
在以下代码片段中,我们创建一个集合并将其命名为old_collection
,然后将其重命名为new_collection
。
from pymilvus import Collection, FieldSchema, CollectionSchema, DataType, connections, utility
connections.connect(alias="default")
schema = CollectionSchema(fields=[
... FieldSchema("int64", DataType.INT64, description="int64", is_primary=True),
... FieldSchema("float_vector", DataType.FLOAT_VECTOR, is_primary=False, dim=128),
... ])
collection = Collection(name="old_collection", schema=schema)
utility.rename_collection("old_collection", "new_collection") # 输出: True
utility.drop_collection("new_collection")
utility.has_collection("new_collection") # 输出: False
修改集合
目前,TTL功能仅在Python中可用。
collection.set_properties(properties={"collection.ttl.seconds": 1800})
上面的示例将集合的TTL更改为1800秒。
检查集合是否存在
验证集合是否存在于Milvus中。
from pymilvus import utility
utility.has_collection("book")
检查集合详情
from pymilvus import Collection
collection = Collection("book") # 获取现有集合。
collection.schema # 返回集合的模式CollectionSchema。
collection.description # 返回集合的描述。
collection.name # 返回集合的名称。
collection.is_empty # 返回一个布尔值,指示集合是否为空。
collection.num_entities # 返回集合中的实体数。
collection.primary_field # 返回主键字段的schema.FieldSchema。
collection.partitions # 返回list [Partition]对象。
collection.indexes # 返回list [Index]对象。
collection.properties # 返回集合中数据的过期时间。
列出所有集合
from pymilvus import utility
utility.list_collections()
删除集合
from pymilvus import utility
utility.drop_collection("book")
创建集合别名
from pymilvus import utility
utility.create_alias(
collection_name = "book",
alias = "publication"
)
删除集合别名
from pymilvus import utility
utility.drop_alias(alias = "publication")
修改集合别名
将现有的别名更改为另一个集合。以下示例基于别名 publication
最初是为另一个集合创建的情况。
from pymilvus import utility
utility.alter_alias(
collection_name = "book",
alias = "publication"
)
加载集合
在进行搜索或查询之前如何将集合加载到内存中。在Milvus中,所有搜索和查询操作都在内存中执行。
Milvus允许用户将集合加载为多个副本,以利用额外的查询节点的CPU和内存资源。这个功能提高了整体的QPS和吞吐量,而无需额外的硬件。在加载集合之前,请确保您已经为其创建了索引。
from pymilvus import Collection, utility
collection = Collection("book")
collection.load(replica_number=2)
utility.load_state("book")
utility.loading_progress("book")
释放集合
如何在搜索或查询后释放集合以减少内存使用。
from pymilvus import Collection
collection = Collection("book") # 获取现有的集合。
collection.release()