Milvus 集合是什么
在 Milvus 里,collection 相当于关系库的表,schema 定义它有哪些字段:一个主键、一到多个向量列(写明 dim 与度量),以及若干标量元数据列用于过滤。集合建好后还要为向量列建索引并把集合 load 进内存,检索才真正可用。schema 决定了过滤能力与后续扩展成本,因为向量维度与度量在建集合后无法修改,改动只能重建集合再重灌数据。
基本信息
| 客户端 | pymilvus 的 MilvusClient(默认端口 19530) |
|---|---|
| 主键 | VARCHAR 或 INT64,需显式指定 is_primary |
| 向量列 | FLOAT_VECTOR + dim,另有 BINARY/SPARSE 等类型 |
| 度量 | COSINE / IP / L2,建索引时指定 |
| 可用前提 | 建索引 + load_collection 之后才可检索 |
典型使用场景
- 新建知识库集合:按切分产物确定字段,把 source、page、version 等元数据一并建列
- 给已有集合加元数据列:先确认版本是否支持动态字段,再决定改 schema 还是走动态字段
- 排查“检索返回空”:先确认集合是否已 load、索引是否已建好
- 多集合隔离:不同业务或不同 embedding 模型各建一个集合,避免维度冲突
- 容量规划:按向量条数乘 dim 乘 4 字节估算内存占用
pymilvus 建集合
pymilvus 建集合
from pymilvus import MilvusClient
client = MilvusClient('http://localhost:19530')
schema = client.create_schema(auto_id=False, enable_dynamic_field=True)
schema.add_field('id', datatype='VARCHAR', max_length=64, is_primary=True)
schema.add_field('vector', datatype='FLOAT_VECTOR', dim=1024)
schema.add_field('source', datatype='VARCHAR', max_length=256)
idx = client.prepare_index_params()
idx.add_index(field_name='vector', index_type='HNSW', metric_type='COSINE',
params={'M': 16, 'efConstruction': 200})
client.create_collection(collection_name='kb', schema=schema, index_params=idx)
client.load_collection('kb') # 载入内存后 search 才可用查看结构
查看结构
print(client.list_collections())
print(client.describe_collection('kb')) # 字段、维度、索引配置
print(client.get_collection_stats('kb')) # 行数统计字段与索引要点
| 配置项 | 含义 | 注意点 |
|---|---|---|
| dim | 向量维度 | 必须等于 embedding 输出维度,建后不可改 |
| metric_type | 距离度量 | 与查询侧归一化策略保持一致 |
| VARCHAR 长度 | 字段上限 | 超长写入整批失败,宁长勿短 |
| dynamic field | 允许未声明字段 | 方便但过滤字段不固定,索引与统计难做 |
容量与运维要点
- 内存估算:向量条数 × dim × 4 字节,再叠加载入索引与标量的开销
- 索引类型取舍:数据量小用 FLAT 保证准确,量大再上 HNSW 或 IVF 系列
- 写入分批:单次批量过大易超时,配合幂等主键可安全重试
- 变更演练:在测试集合上先跑一遍重建流程,确认耗时与资源占用
向量维度与度量建集合后不可修改:换 embedding 模型要新建集合并整体重灌,混用会导致写入或检索直接报错。