Milvus 向量数据库基础:从连接到索引,一篇搞懂核心操作
前言
在构建 RAG(检索增强生成)或语义搜索系统时,向量数据库 是必不可少的一环,而 Milvus 因其高性能、易扩展的特点成为主流选择。
本文围绕 Milvus 最基础的四个步骤------连接 、创建 Collection(建表) 、插入数据 、创建索引------进行梳理,让没有接触过向量数据库的读者也能快速上手。
一、连接 Milvus
1.1 什么是 Milvus
Milvus 是专门存储和检索向量数据的数据库 。
相比传统数据库按精确值查询,Milvus 按语义相似度 进行搜索。
存储的数据由两部分组成:
- 向量数据 :由 Embedding 模型生成的数字向量(如
[0.1, -0.3, ...]) - 标量数据:普通字段,如 ID、文本、标签等
1.2 连接方式
使用 pymilvus 库连接,常见场景如下:
| 场景 | URI 示例 |
|---|---|
| 本地轻量(Milvus Lite) | milvus_demo.db |
| Docker/远程服务 | http://192.168.142.128:19530 |
| 带认证连接 | http://localhost:19530 + 用户/密码 |
| 云服务(Zilliz Cloud) | https://your-cluster.zillizcloud.com + token |
| 一行式完整参数 | http://user:password@host:port/db_name |
1.3 连接代码骨架
python
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530")
# 验证连接
print(client.get_server_version())
二、创建 Collection(类似数据库的表)
2.1 核心概念
- Collection:相当于关系数据库中的一张表,包含向量字段和标量字段。
- Schema:定义表的字段结构(字段名、类型、向量维度等)。
- 主键 :可自动生成(
auto_id=True)或手动指定(auto_id=False)。
2.2 常见的建表模式
① 快速建表(简单场景)
python
client.create_collection(
collection_name="my_collection",
dimension=768, # 与 Embedding 模型输出维度一致
auto_id=True,
metric_type="COSINE" # 相似度度量
)
② 自定义字段(生产常用)
python
from pymilvus import FieldSchema, CollectionSchema, DataType
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=65535),
FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=256),
FieldSchema(name="category", dtype=DataType.VARCHAR, max_length=64),
FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=768)
]
schema = CollectionSchema(fields=fields)
client.create_collection("my_collection", schema=schema, metric_type="COSINE")
③ 多向量字段(多模态)
可同时定义 text_embedding 和 image_embedding 等字段,用于图文混合检索。
④ 动态字段(Milvus 2.3+)
设置 enable_dynamic_field=True,可在插入时附加未预定义的标量字段,类似 MongoDB 的灵活性。
2.3 建表时必须确定的要素
| 要素 | 说明 |
|---|---|
| 向量维度 | 必须与 Embedding 模型输出一致(如 768/1024/1536) |
| 度量类型 | COSINE(最常用)/ L2 / IP |
| 主键策略 | 无外部依赖用自增,需同步外部 ID 用手动 |
| 字段类型 | INT64、VARCHAR(需 max_length)、FLOAT_VECTOR |
| 可重复性 | 教学或实验时常写"建表前先删表"逻辑 |
三、插入数据
3.1 Embedding:数据的数学指纹
把文本、图片等内容转换成向量的过程称为 Embedding 。
相似的内容在向量空间中距离更近。
生产环境必须使用真实 Embedding 模型(如阿里云百炼 DashScope、BGE-M3 等),模拟数据仅用于教学演示。
3.2 插入方式
单条插入(实时,性能低)
python
data = {"content": "人工智能简介", "vector": [0.1]*768}
client.insert(collection_name="my_collection", data=data)
批量插入(推荐,100~1000 条/批)
python
data = [
{"content": "文本1", "vector": [0.1]*768},
{"content": "文本2", "vector": [0.2]*768}
]
client.insert(collection_name="my_collection", data=data)
client.flush(collection_name="my_collection") # 使数据对搜索可见
手动指定 ID
python
# 建表时 auto_id=False
data = [{"id": 1001, "content": "...", "vector": [...]}]
client.insert(collection_name="my_collection", data=data)
3.3 避坑要点
- 向量维度必须匹配,否则插入报错。
- VARCHAR 字段不能超过定义的
max_length。 - 大量插入前不要建索引,插入完毕后再建立索引,速度更快。
- 批量大小建议 100 ~ 1000 条,减少网络开销。
- 生产级项目务必使用真实 Embedding,不要用随机数代替。
四、创建索引
4.1 为什么需要索引?
没有索引 → 全表扫描,数据量大时极慢。
有索引 → 类似书的目录,直接定位到最相似的向量。
但索引并非没有代价,本质上是用少量精度损失 + 额外内存开销换取数倍到数十倍的检索速度提升。
4.2 四大索引类型快查
| 索引类型 | 适应数据量 | 精度 | 速度 | 内存 |
|---|---|---|---|---|
| FLAT | < 1 万 | 100% | 慢 | 低 |
| IVF_FLAT | 1万 -- 100万 | 95-98% | 快 | 中 |
| IVF_PQ | > 100 万 | 90-95% | 很快 | 低(压缩) |
| HNSW | 高精度/低延迟需求 | 98-99% | 最快 | 高 |
4.3 选型口诀
- 万级以下 → FLAT(简单,无需训练)
- 万级到百万级 → IVF_FLAT(建议
nlist ≈ √总向量数) - 百万级以上 → IVF_PQ 或 HNSW
- RAG / 强语义搜索 → 通常使用 HNSW
4.4 关键参数一句话解读
IVF_FLAT
- nlist:把向量分成多少个簇(越大每个簇越小,搜索越快但可能漏掉边缘结果)
- nprobe:搜索时探查多少个簇(越大精度越高,搜索越慢)
形象比喻:图书馆书架数量 vs 你一次去几个书架找书
HNSW
- M:每个节点的最大连接数(越大图越密,精度高但内存大)
- efConstruction:构建图时的搜索宽度(越大建图质量越高,但建索引更慢)
- ef:搜索时的队列宽度(越大搜索精度越高,搜索变慢,必须大于 top-K 值)
形象比喻:人脉网的"朋友数"和"打听范围"
4.5 索引创建步骤
python
# 1. 释放集合(若已加载)
client.release_collection("my_collection")
# 2. 准备索引参数
index_params = client.prepare_index_params()
index_params.add_index(
field_name="vector",
index_type="IVF_FLAT", # 或 HNSW
metric_type="COSINE",
params={"nlist": 128} # IVF_FLAT 参数
)
# 3. 创建索引
client.create_index("my_collection", index_params)
# 4. 加载到内存
client.load_collection("my_collection")
4.6 索引日常管理
- 查看 :
client.describe_index(collection_name, "vector") - 删除 :
client.drop_index(collection_name, "vector") - 重建时机:大量更新数据后、调整参数、索引损坏时
总结
本文把 Milvus 最常用的四大环节串了起来:
连接 Milvus → 创建 Collection → 生成真实 Embedding → 插入数据 → 创建索引 → 搜索(后续文章详解)
掌握这些基础后,你已经能够搭建一个可用的向量存储与检索流程。后续可以进一步学习向量搜索 、分区 、数据删除 以及生产环境的参数调优。