Milvus 向量数据库基础

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_embeddingimage_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 避坑要点

  1. 向量维度必须匹配,否则插入报错。
  2. VARCHAR 字段不能超过定义的 max_length
  3. 大量插入前不要建索引,插入完毕后再建立索引,速度更快。
  4. 批量大小建议 100 ~ 1000 条,减少网络开销。
  5. 生产级项目务必使用真实 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 → 插入数据 → 创建索引 → 搜索(后续文章详解)

掌握这些基础后,你已经能够搭建一个可用的向量存储与检索流程。后续可以进一步学习向量搜索分区数据删除 以及生产环境的参数调优

相关推荐
渣渣灰95874 小时前
基于STM32F03ZET6移植FreeRTOS
数据库·stm32·嵌入式硬件
庞轩px4 小时前
第七篇:Redis分布式锁——从setnx到RedLock的演进之路
数据库·redis·分布式锁·redission·setnx·redlock·可重入锁
WL_Aurora5 小时前
IDEA 连接 MySQL 数据库保姆级教程
数据库·mysql·intellij-idea
mpHH5 小时前
postgresql plancache
数据库·postgresql
倔强的石头_5 小时前
云原生环境下的存储弹性与自动化:表空间目录动态挂载与冷热分层实践
数据库
无限进步_5 小时前
【C++】从红黑树到 map 和 set:封装设计与迭代器实现
开发语言·数据结构·数据库·c++·windows·github·visual studio
橙子圆1235 小时前
Redis知识2
java·数据库·redis
过期动态5 小时前
【RabbitMQ基础篇】RabbitMQ从入门到实战
java·jvm·数据库·分布式·spring·rabbitmq·intellij-idea
MandalaO_O5 小时前
MySQL:数据库约束
数据库·mysql