管理Collections

更新时间:

Milvus中的Collections类似于关系型数据库中的“表”,是组织和管理向量数据以及相关标量元数据的核心单元。通过灵活配置索引、分区和分片,您能够根据实际需求定制化数据处理流程,实现从数据摄入、存储、查询到分析的全链路解决方案。

前提条件

  • 已在本地客户端成功安装了PyMilvus库,并将其更新至当前最新版本。

    如果您尚未在本地客户端安装PyMilvus库,或者需要将其更新至当前最新版本,您可以执行以下命令。

    pip install --upgrade pymilvus
  • 已创建Milvus实例,请参见详情快速创建Milvus实例

创建Collection

快速创建Collection

您可以通过指定Collection的名称和向量维度来快速创建Collection。

from pymilvus import MilvusClient

# 创建Milvus Client。
client = MilvusClient(
    uri="http://c-xxxx.milvus.aliyuncs.com:19530",  # Milvus实例的公网地址。
    token="<yourUsername>:<yourPassword>",  # 登录Milvus实例的用户名和密码。
    db_name="default"  # 待连接的数据库名称,本文示例为默认的default。
)

# 创建名称为milvus_collection的Collection。
client.create_collection(
    collection_name="milvus_collection",
    dimension=5
)

res = client.get_load_state(
    collection_name="milvus_collection"
)
# 返回Collection当前的加载状态。
print(res)

运行此代码可创建一个仅含有两个字段“id”(主键)和“vector”(向量字段)的Collection,同时默认启用“auto_id”和“enable_dynamic_field”属性。

  • auto_id: 当启用此属性后,系统将自动为每条记录分配一个自增的主键值,无需手动设置主键。

  • enable_dynamic_field: 启用此属性后,除已定义的“id”和“vector”字段外,其他任意新字段都会被视为动态字段,并以键值对形式存储于名为$meta的特殊字段中。这一特性允许插入尚未定义的新字段。

通过上述设置,可以在不预先定义所有字段的情况下,灵活地插入和管理数据。

自定义创建Collection

自定义创建Collection时,您可以根据需要指定schema和index参数。

from pymilvus import MilvusClient, DataType, time

# 创建Milvus Client。
client = MilvusClient(
    uri="http://c-xxxx.milvus.aliyuncs.com:19530",  # Milvus实例的公网地址。
    token="<yourUsername>:<yourPassword>",  # 登录Milvus实例的用户名和密码。
    db_name="default"  # 待连接的数据库名称,本文示例为默认的default。
)

# 创建Schema。
schema = MilvusClient.create_schema(
    auto_id=False,  # 禁用ID自动生成。
    enable_dynamic_field=True,  # 支持动态字段。
)

# 添加schema字段
# 添加名为test_id的字段,数据类型为INT64,表示一个整数类型的主键字段。
schema.add_field(field_name="test_id", datatype=DataType.INT64, is_primary=True)
# 添加名为test_vector的字段,数据类型为FLOAT_VECTOR,dim(维度)为768。
schema.add_field(field_name="test_vector", datatype=DataType.FLOAT_VECTOR, dim=768)

# 定义index参数。
index_params = client.prepare_index_params()

# 添加index参数。
index_params.add_index(
    field_name="test_id",  # 设置索引名称。
    index_type="STL_SORT"  # 设置索引类型。
)


index_params.add_index(
    field_name="test_vector",  # 设置索引名称。
    index_type="IVF_SQ8",      # 设置索引类型。
    metric_type="L2",          # 设置度量类型,例如L2。
    params={"nlist": 128}
)
# 创建collection时加载index。
client.create_collection(
    collection_name="milvus_collection",  # 创建名称为milvus_collection的Collection。
    schema=schema,
    index_params=index_params
)

time.sleep(5)

res = client.get_load_state(
    collection_name="milvus_collection"
)

print(res)

您也可以将collection和index分开创建,代码示例如下所示。

# 创建名称为milvus_collection1的Collection。
client.create_collection(
    collection_name="milvus_collection1",
    schema=schema,
)
# 查询milvus_collection1的加载状态。
res = client.get_load_state(
    collection_name="milvus_collection1"
)

print(res)
# 为milvus_collection1创建索引。
client.create_index(
    collection_name="milvus_collection1",
    index_params=index_params
)
# 查询创建索引后milvus_collection1的加载状态。
res = client.get_load_state(
    collection_name="milvus_collection1"
)

print(res)

查看Collection

  • 查看Collection明细。

    res = client.describe_collection(collection_name="milvus_collection")
    
    print(res)
    
  • 查看当前Database下的所有Collections。

    res = client.list_collections()
    
    print(res)
    

加载和卸载Collection

在对Collection进行加载操作时,Milvus会同步将该Collection关联的索引文件载入内存。反之,当执行Collection的卸载操作时,Milvus会将其索引文件从内存中移除。为了确保搜索操作的正常进行,您必须确保在对Collection进行检索时,该Collection已处于加载状态。

加载Collection

client.load_collection(
    collection_name="milvus_collection"
)

res = client.get_load_state(
    collection_name="milvus_collection"
)

print(res)

卸载Collection

client.release_collection(
    collection_name="milvus_collection"
)

res = client.get_load_state(
    collection_name="milvus_collection"
)

print(res)

删除Collection

client.drop_collection(
    collection_name="milvus_collection"
)

client.drop_collection(
    collection_name="milvus_collection1"
)