Milvus:集合(Collections)操作详解(三)

一、Collections 核心概念

在开始实操前,需先理解 Collections 及其关联概念,这是后续操作的基础。

1.1 什么是 Collections?

Collections 是 Milvus 中用于管理数据的 "二维表",类比关系数据库中的 "表",主要特点如下:

  • 结构固定:每一列对应一个 "字段(Field)",字段的类型、约束等需提前定义。
  • 数据灵活:每一行对应一个 "实体(Entity)",实体数量可根据需求动态增减。
  • 核心作用:所有数据(向量、标量等)需插入到 Collections 中,才能进行后续的搜索和查询。
1.2 关键关联概念

二、Collections 核心操作

本节是重点,将按 "创建 → 查看 → 修改 → 加载 / 释放 → 删除" 的流程,提供完整代码示例。

2.1 创建 Collections(核心步骤)

创建 Collections 需先定义 Schema (数据结构),再设置可选的 索引参数集合属性(如 TTL、分片数)。

步骤 1:初始化 Milvus 客户端
python 复制代码
from pymilvus import MilvusClient, DataType

# 连接 Milvus 服务
client = MilvusClient(
    uri="http://localhost:19530",  # 服务地址
    token="root:Milvus"            # 认证 Token(默认值)
)
步骤 2:定义 Schema(数据结构)

Schema 需包含 主键字段 和 向量字段(必选),可添加标量字段(如 VARCHAR)和动态字段(可选)。

python 复制代码
# 1. 创建 Schema 对象(关闭 AutoId,开启动态字段)
schema = client.create_schema(
    auto_id=False,               # 关闭自动生成主键(需手动传入主键值)
    enable_dynamic_field=True    # 开启动态字段(支持插入 Schema 未定义的字段)
)

# 2. 向 Schema 中添加字段
# 字段 1:主键(INT64 类型,唯一标识实体)
schema.add_field(
    field_name="user_id",        # 字段名
    datatype=DataType.INT64,     # 数据类型
    is_primary=True              # 标记为主键
)

# 字段 2:向量字段(FLOAT_VECTOR 类型,维度为 5)
schema.add_field(
    field_name="user_embedding", # 字段名
    datatype=DataType.FLOAT_VECTOR,
    dim=5                        # 向量维度(需与实际数据一致)
)

# 字段 3:标量字段(VARCHAR 类型,存储用户名称)
schema.add_field(
    field_name="user_name",
    datatype=DataType.VARCHAR,
    max_length=512               # VARCHAR 类型必须指定最大长度
)
步骤 3:设置索引参数(可选)

索引用于提升搜索效率,向量字段必须创建索引,标量字段可根据过滤需求创建。

python 复制代码
# 1. 初始化索引参数对象
index_params = client.prepare_index_params()

# 2. 为主键添加索引(AUTOINDEX 自动选择合适的索引类型)
index_params.add_index(
    field_name="user_id",
    index_type="AUTOINDEX"
)

# 3. 为向量字段添加索引(指定度量类型为 COSINE,用于计算向量相似度)
index_params.add_index(
    field_name="user_embedding",
    index_type="AUTOINDEX",
    metric_type="COSINE"  # 度量类型:COSINE(余弦相似度)、L2(欧氏距离)、IP(内积)
)
步骤 4:创建 Collections

可选择 "创建时自动加载"(带索引参数)或 "创建后手动加载"(不带索引参数)。

python 复制代码
# 方式 1:创建时带索引参数(自动加载 Collections)
client.create_collection(
    collection_name="user_collection",  # 集合名称(自定义)
    schema=schema,                      # 传入定义好的 Schema
    index_params=index_params,          # 传入索引参数
    num_shards=1,                       # 分片数(默认 1,数据量大时可增加)
    properties={"collection.ttl.seconds": 86400}  # TTL:数据保留 1 天(86400 秒)
)

# 检查加载状态(应返回 "Loaded")
load_state = client.get_load_state(collection_name="user_collection")
print("加载状态:", load_state)  # 输出:{"state": "<LoadState: Loaded>"}

# 方式 2:创建时不带索引参数(后续手动添加索引,初始状态为 "NotLoad")
# client.create_collection(
#     collection_name="user_collection_no_index",
#     schema=schema
# )
2.2 查看 Collections 信息

创建后可通过代码查看集合列表、集合详情等信息。

2.2.1 列出所有 Collections
python 复制代码
# 获取当前数据库中所有集合名称
collections = client.list_collections()
print("所有集合:", collections)  # 输出:["user_collection"]
2.2.2 查看集合详情(Schema、索引、属性等)
python 复制代码
# 查看 "user_collection" 的详细信息
collection_info = client.describe_collection(collection_name="user_collection")
print("集合详情:", collection_info)

# 关键输出解读:
# - "fields":显示所有字段的定义(类型、是否主键等)
# - "num_shards":分片数
# - "properties":TTL 等属性
# - "consistency_level":一致性级别(默认 Bounded)
2.3 修改 Collections

支持修改集合属性(如 TTL、动态字段)、重命名集合、管理别名等操作。

2.3.1 修改集合属性(以 TTL 为例)
python 复制代码
# 1. 更改 TTL 为 2 天(172800 秒)
client.alter_collection_properties(
    collection_name="user_collection",
    properties={"collection.ttl.seconds": 172800}
)

# 2. 删除 TTL(数据永久保留)
# client.drop_collection_properties(
#     collection_name="user_collection",
#     property_keys=["collection.ttl.seconds"]
# )
2.3.2 重命名集合
python 复制代码
# 将 "user_collection" 重命名为 "user_collection_v2"
client.rename_collection(
    old_name="user_collection",
    new_name="user_collection_v2"
)
2.3.3 管理别名(生产环境常用)

别名可动态指向不同集合,适合无缝切换数据(如 A/B 测试、数据更新)。

python 复制代码
# 1. 为集合创建别名(一个集合可多个别名)
client.create_alias(
    collection_name="user_collection_v2",
    alias="user_prod"  # 生产环境用的别名
)

# 2. 列出集合的所有别名
aliases = client.list_aliases(collection_name="user_collection_v2")
print("集合别名:", aliases)  # 输出:{"aliases": ["user_prod"], ...}

# 3. 切换别名(指向新集合)
# client.create_collection(collection_name="user_collection_v3", schema=schema)  # 新建集合
# client.alter_alias(collection_name="user_collection_v3", alias="user_prod")  # 别名指向新集合

# 4. 删除别名
# client.drop_alias(alias="user_prod")
2.4 加载与释放 Collections

Milvus 搜索 / 查询需先将集合加载到内存,不使用时释放内存以节约资源。

2.4.1 加载集合(全量加载或部分字段加载)
python 复制代码
# 方式 1:全量加载(加载所有字段)
client.load_collection(collection_name="user_collection_v2")

# 方式 2:部分字段加载(仅加载需要的字段,减少内存占用)
# client.load_collection(
#     collection_name="user_collection_v2",
#     load_fields=["user_id", "user_embedding"],  # 仅加载主键和向量字段
#     skip_load_dynamic_field=True  # 不加载动态字段
# )

# 检查加载状态
load_state = client.get_load_state(collection_name="user_collection_v2")
print("加载状态:", load_state)  # 输出:{"state": "<LoadState: Loaded>"}
2.4.2 释放集合(不使用时释放内存)
python 复制代码
# 释放集合(内存中的数据会被清除,不影响磁盘存储)
client.release_collection(collection_name="user_collection_v2")

# 检查释放状态
load_state = client.get_load_state(collection_name="user_collection_v2")
print("释放后状态:", load_state)  # 输出:{"state": "<LoadState: NotLoad>"}
2.5 管理分区

分区是集合的子集,可按业务逻辑(如时间、地域)划分数据,提升搜索效率。

2.5.1 创建分区
python 复制代码
# 为 "user_collection_v2" 创建分区(按用户地域划分)
client.create_partition(
    collection_name="user_collection_v2",
    partition_name="user_partition_beijing"  # 分区名称
)

# 列出集合的所有分区(默认有 "_default" 分区)
partitions = client.list_partitions(collection_name="user_collection_v2")
print("所有分区:", partitions)  # 输出:["_default", "user_partition_beijing"]
2.5.2 加载 / 释放分区
python 复制代码
# 加载指定分区
client.load_partitions(
    collection_name="user_collection_v2",
    partition_names=["user_partition_beijing"]
)

# 释放指定分区
# client.release_partitions(
#     collection_name="user_collection_v2",
#     partition_names=["user_partition_beijing"]
# )
2.5.3 删除分区(需先释放)
python 复制代码
# 1. 先释放分区
client.release_partitions(
    collection_name="user_collection_v2",
    partition_names=["user_partition_beijing"]
)

# 2. 删除分区(分区内数据会被永久删除)
client.drop_partition(
    collection_name="user_collection_v2",
    partition_name="user_partition_beijing"
)
2.6 删除 Collections

不再需要的集合可永久删除(需谨慎,删除后数据无法恢复)。

python 复制代码
# 删除 "user_collection_v2"(删除前无需释放,但建议先释放内存)
client.drop_collection(collection_name="user_collection_v2")

# 验证是否删除(列表中应无该集合)
collections = client.list_collections()
print("删除后所有集合:", collections)  # 输出:[]
2.7 常见问题与注意事项
  1. 向量维度不匹配 :创建向量字段时定义的 dim 需与插入的向量维度一致,否则会报错。
  2. 主键唯一性 :关闭 AutoId 时,手动传入的主键值必须唯一,重复会插入失败。
  3. 索引必选性:向量字段必须创建索引才能搜索,标量字段可根据过滤需求决定是否创建。
  4. 内存占用:加载集合时会占用内存,数据量大时建议使用 "部分字段加载" 或 "分区加载"。
相关推荐
寒秋丶6 小时前
Milvus:Schema详解(四)
数据库·人工智能·python·ai·ai编程·milvus·向量数据库
CAD老兵6 小时前
量化技术:如何让你的 3D 模型和 AI 模型瘦身又飞快
人工智能·深度学习·机器学习
算法与编程之美6 小时前
探索不同的优化器对分类精度的影响和卷积层的输入输出的shape的计算公式
人工智能·深度学习·机器学习·分类·数据挖掘
大千AI助手6 小时前
微软SPARTA框架:高效稀疏注意力机制详解
人工智能·深度学习·神经网络·llm·大千ai助手·sparta·稀疏注意力机制
林九生6 小时前
【人工智能】使用 vLLM 高效部署大语言模型:以 secGpt14b 为例
人工智能·语言模型·自然语言处理
梨轻巧6 小时前
pyside6常用控件:QComboBox() 下拉菜单
python
云茧6 小时前
机器学习中的Hello World:线性回归(一)
人工智能·机器学习·线性回归
kyle~6 小时前
CPU调度---协程
java·linux·服务器·数据库·c++20
IDOlaoluo6 小时前
SQL Server 2017 Developer 中文版安装教程(64位 ISO 文件详细步骤)
服务器·数据库·负载均衡