一架梯子,一头程序猿,仰望星空!
Milvus向量数据库教程 > 内容正文

Python Milvus集合管理


Milvus的集合(Collection)类似MYSQL的表,用于组织数据,由一个或多个分区组成。

创建集合

一个集合由一个或多个分区组成。在创建新集合时,Milvus会创建一个名为_default的默认分区。详细信息请参见术语解释 - 集合相关部分。

下面的示例将创建一个名为book的两个分区的集合,其中包括一个名为book_id的主键字段,一个名为word_countINT64标量字段和一个名为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 控制字段是否为主键字段的开关。主键字段需要指定此参数。 TrueFalse
auto_id 开启或关闭自动ID(主键)分配的开关。主键字段需要指定此参数,默认为False TrueFalse
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 (truefalse)。可选,默认为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()


关联主题