首页/AI/RAG 与向量库速查/Milvus 建集合与字段

Milvus 建集合与字段

建集合先定义字段结构:主键、向量列(dim 与度量)、以及元数据标量列;之后创建索引并把集合载入内存,检索才可用;schema 设计决定过滤能力与扩展成本。

RAG 与向量库速查AI更新于 2026-10-13

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 模型要新建集合并整体重灌,混用会导致写入或检索直接报错。

易错点

  • 把动态字段当默认能力滥用,过滤字段不固定导致索引与统计难做
  • 主键长度超限或类型不符,一条脏数据让整批写入失败
  • 忘记 load_collection,写入正常但检索一直返回空
  • dim 与模型输出不一致,写入时才报错,白跑一遍向量化
  • 把过滤字段当成“随便查查就行”,高频过滤字段没建标量索引,查询退化成全量扫描

数据来源与参考

  • Milvus 官方文档(Manage Collections / Schema)
  • pymilvus 官方文档(MilvusClient)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌