集合操作 #

一、Collection概述 #

1.1 什么是Collection #

Collection 是 Milvus 中存储实体的逻辑单元,类似于关系数据库中的表。

text
Collection结构:

┌─────────────────────────────────────────┐
│         Collection: products            │
├─────────────────────────────────────────┤
│  Schema定义:                            │
│  ├── 字段列表                            │
│  ├── 描述信息                            │
│  └── 动态字段设置                        │
├─────────────────────────────────────────┤
│  数据存储:                              │
│  ├── 分区列表                            │
│  ├── 段列表                              │
│  └── 索引列表                            │
├─────────────────────────────────────────┤
│  统计信息:                              │
│  ├── 实体数量                            │
│  └── 存储大小                            │
└─────────────────────────────────────────┘

二、创建Collection #

2.1 定义Schema #

python
from pymilvus import FieldSchema, CollectionSchema, DataType

fields = [
    FieldSchema(
        name="id",
        dtype=DataType.INT64,
        is_primary=True,
        auto_id=False,
        description="主键ID"
    ),
    FieldSchema(
        name="title",
        dtype=DataType.VARCHAR,
        max_length=512,
        description="标题"
    ),
    FieldSchema(
        name="content",
        dtype=DataType.VARCHAR,
        max_length=65535,
        description="内容"
    ),
    FieldSchema(
        name="embedding",
        dtype=DataType.FLOAT_VECTOR,
        dim=768,
        description="嵌入向量"
    )
]

schema = CollectionSchema(
    fields=fields,
    description="文档集合",
    enable_dynamic_field=True
)

2.2 创建Collection #

python
from pymilvus import Collection

collection = Collection(
    name="documents",
    schema=schema,
    using="default",
    shards_num=2
)

2.3 创建参数说明 #

参数 类型 说明
name str Collection名称
schema CollectionSchema Schema定义
using str 连接别名
shards_num int 分片数量
num_partitions int 分区数量限制
consistency_level str 一致性级别

2.4 一致性级别 #

python
from pymilvus import ConsistencyLevel

collection = Collection(
    name="documents",
    schema=schema,
    consistency_level=ConsistencyLevel.STRONG
)
级别 说明 适用场景
STRONG 强一致性 金融、交易
EVENTUALLY 最终一致性 日志、分析
BOUNDED 有界一致性 通用场景
SESSION 会话一致性 用户会话

2.5 使用已有Collection #

python
collection = Collection("documents")

print(collection.name)
print(collection.schema)
print(collection.description)

三、查看Collection #

3.1 列出所有Collection #

python
from pymilvus import utility

collections = utility.list_collections()
print(collections)

3.2 检查Collection是否存在 #

python
has_collection = utility.has_collection("documents")
print(has_collection)

3.3 获取Collection信息 #

python
collection = Collection("documents")

print(collection.schema)

print(collection.description)

print(collection.num_entities)

print(collection.primary_field)

print(collection.partitions)

print(collection.indexes)

3.4 获取统计信息 #

python
stats = collection.stats
print(stats)

四、加载与释放 #

4.1 加载Collection #

python
collection.load()

collection.load(
    replica_number=2,
    timeout=60
)

print(collection.is_loaded)

print(collection.replica_number)

4.2 释放Collection #

python
collection.release()

print(collection.is_loaded)

4.3 刷新数据 #

python
collection.flush()

collection.flush(timeout=120)

4.4 压缩数据 #

python
collection.compact()

collection.compact(timeout=300)

五、修改Collection #

5.1 设置属性 #

python
collection.set_properties({
    "collection.ttl.seconds": 86400
})

5.2 修改一致性级别 #

python
from pymilvus import ConsistencyLevel

collection.set_properties({
    "consistency.level": ConsistencyLevel.EVENTUALLY
})

5.3 添加字段(动态字段) #

python
collection.set_properties({
    "collection.enable_dynamic_field": True
})

六、删除Collection #

6.1 删除Collection #

python
from pymilvus import utility

utility.drop_collection("documents")

6.2 安全删除 #

python
if utility.has_collection("documents"):
    utility.drop_collection("documents")

6.3 删除前检查 #

python
collection = Collection("documents")

if collection.num_entities > 0:
    print(f"警告: Collection包含 {collection.num_entities} 条数据")

utility.drop_collection("documents")

七、Collection别名 #

7.1 创建别名 #

python
utility.create_alias("documents", "docs")

utility.create_alias("documents", "documents_v1")

7.2 列出别名 #

python
aliases = utility.list_aliases("documents")
print(aliases)

7.3 删除别名 #

python
utility.drop_alias("docs")

7.4 别名应用场景 #

text
别名使用场景:

┌─────────────────────────────────────────┐
│         版本切换                         │
├─────────────────────────────────────────┤
│                                         │
│  documents_v1 ──┐                       │
│  documents_v2 ──┼──▶ production        │
│  documents_v3 ──┘                       │
│                                         │
│  应用始终使用 "production" 别名          │
│  切换版本只需修改别名指向                │
│                                         │
└─────────────────────────────────────────┘

八、Collection最佳实践 #

8.1 Schema设计建议 #

python
fields = [
    FieldSchema(
        name="id",
        dtype=DataType.INT64,
        is_primary=True,
        auto_id=False
    ),
    FieldSchema(
        name="embedding",
        dtype=DataType.FLOAT_VECTOR,
        dim=768
    ),
    FieldSchema(
        name="created_at",
        dtype=DataType.INT64
    ),
    FieldSchema(
        name="metadata",
        dtype=DataType.JSON
    )
]

schema = CollectionSchema(
    fields=fields,
    description="最佳实践示例",
    enable_dynamic_field=True
)

8.2 分片数量选择 #

text
分片数量建议:

数据量          分片数
────────────────────────
< 100万         1
100万-1000万    2-4
1000万-1亿      4-8
> 1亿           8-16

考虑因素:
- 写入并发量
- 数据分布
- 查询模式

8.3 命名规范 #

python
collection_names = [
    "user_profiles",
    "product_embeddings",
    "document_vectors",
    "image_features"
]

bad_names = [
    "UserProfiles",
    "product-embeddings",
    "document vectors",
    "123collection"
]

九、完整示例 #

9.1 创建文档Collection #

python
from pymilvus import (
    connections,
    FieldSchema,
    CollectionSchema,
    Collection,
    DataType,
    utility
)

connections.connect("default", host="localhost", port="19530")

if utility.has_collection("documents"):
    utility.drop_collection("documents")

fields = [
    FieldSchema(
        name="doc_id",
        dtype=DataType.INT64,
        is_primary=True,
        auto_id=False
    ),
    FieldSchema(
        name="title",
        dtype=DataType.VARCHAR,
        max_length=512
    ),
    FieldSchema(
        name="content",
        dtype=DataType.VARCHAR,
        max_length=65535
    ),
    FieldSchema(
        name="author",
        dtype=DataType.VARCHAR,
        max_length=128
    ),
    FieldSchema(
        name="tags",
        dtype=DataType.ARRAY,
        element_type=DataType.VARCHAR,
        max_capacity=20,
        max_length=64
    ),
    FieldSchema(
        name="embedding",
        dtype=DataType.FLOAT_VECTOR,
        dim=768
    ),
    FieldSchema(
        name="created_at",
        dtype=DataType.INT64
    )
]

schema = CollectionSchema(
    fields=fields,
    description="文档向量集合",
    enable_dynamic_field=True
)

collection = Collection(
    name="documents",
    schema=schema,
    shards_num=2
)

print(f"Collection '{collection.name}' 创建成功")
print(f"字段数量: {len(collection.schema.fields)}")

9.2 创建图像Collection #

python
fields = [
    FieldSchema(
        name="image_id",
        dtype=DataType.INT64,
        is_primary=True,
        auto_id=True
    ),
    FieldSchema(
        name="image_path",
        dtype=DataType.VARCHAR,
        max_length=1024
    ),
    FieldSchema(
        name="category",
        dtype=DataType.VARCHAR,
        max_length=64
    ),
    FieldSchema(
        name="width",
        dtype=DataType.INT32
    ),
    FieldSchema(
        name="height",
        dtype=DataType.INT32
    ),
    FieldSchema(
        name="feature_vector",
        dtype=DataType.FLOAT_VECTOR,
        dim=512
    )
]

schema = CollectionSchema(
    fields=fields,
    description="图像特征集合"
)

collection = Collection(
    name="images",
    schema=schema
)

十、常见问题 #

10.1 Collection已存在 #

python
if utility.has_collection("documents"):
    print("Collection已存在")
    collection = Collection("documents")
else:
    collection = Collection("documents", schema=schema)

10.2 Schema不匹配 #

python
existing_collection = Collection("documents")
existing_schema = existing_collection.schema

for field in schema.fields:
    if field.name not in [f.name for f in existing_schema.fields]:
        print(f"字段 {field.name} 不存在")

10.3 加载超时 #

python
try:
    collection.load(timeout=300)
except Exception as e:
    print(f"加载超时: {e}")
    collection.load(replica_number=1)

十一、总结 #

Collection操作速查表:

操作 方法
创建 Collection(name, schema)
查看 utility.list_collections()
检查存在 utility.has_collection(name)
加载 collection.load()
释放 collection.release()
删除 utility.drop_collection(name)
创建别名 utility.create_alias()
删除别名 utility.drop_alias()

下一步,让我们学习Schema设计!

最后更新:2026-04-04