Milvus 2.x 入门实战:从安装到第一次相似度查询 🚀
🔥本文是《向量数据库实战:选型、调优与落地》专栏第 06 篇
⏱️阅读时间:约 15 分钟
🎯 开篇:为什么选 Milvus 作为第一个实战?
在六大向量数据库中,我选择Milvus作为第一个实战对象,原因很简单 👇
| 理由 | 说明 |
|---|---|
| 🏆 最成熟 | 2019 年开源,经过 5 年迭代,社区最活跃 |
| 🌟 GitHub Star 最多 | 30k+ Star,全球最大向量数据库社区 |
| 📦 功能最全 | 支持 HNSW/IVF/PQ/DiskANN 等全部主流索引 |
| 🏗️ 分布式原生 | 从设计之初就支持水平扩展 |
| 🇨🇳 国产之光 | Zilliz 公司主导开发,中文文档完善 |
一句话:学向量数据库,从 Milvus 开始,性价比最高🎯
🛠️ 环境搭建
方式一:Docker Compose(推荐新手)
# 下载 docker-compose 文件wgethttps://github.com/milvus-io/milvus/releases/download/v2.4.17/milvus-standalone-docker-compose.yml-Odocker-compose.yml# 启动dockercompose up-d# 查看状态dockercomposeps启动后的组件:
┌─────────────────────────────────────────────────────┐ │ Milvus Standalone 架构 │ ├─────────────────────────────────────────────────────┤ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Milvus │◄──►│ etcd │ │ MinIO │ │ │ │ Server │ │ (元数据) │ │ (对象存储)│ │ │ │ :19530 │ │ :2379 │ │ :9000 │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ │ │ gRPC │ │ ▼ │ │ ┌──────────┐ │ │ │ Attu │ ← Web 管理界面(可选) │ │ │ :8000 │ │ │ └──────────┘ │ │ │ └─────────────────────────────────────────────────────┘方式二:Python SDK 安装
# 安装 PyMilvuspipinstallpymilvus>=2.4.0# 验证安装python-c"import pymilvus; print(pymilvus.__version__)"📝 第一次完整实战
Step 1:连接 Milvus
frompymilvusimportconnections,utility# 连接 Milvusconnections.connect(alias="default",host="localhost",port="19530")# 检查连接状态print(f"Milvus 版本:{utility.get_server_version()}")# 输出: Milvus 版本: 2.4.xStep 2:创建集合(Collection)
frompymilvusimportCollectionSchema,FieldSchema,DataType# 定义字段# 1. 主键字段id_field=FieldSchema(name="id",dtype=DataType.INT64,is_primary=True,# 主键auto_id=True# 自动生成 ID)# 2. 文本字段(存储原始文本)text_field=FieldSchema(name="text",dtype=DataType.VARCHAR,max_length=65535# 最大长度)# 3. 向量字段(存储 embedding)vector_field=FieldSchema(name="embedding",dtype=DataType.FLOAT_VECTOR,dim=1024# 向量维度,要和嵌入模型匹配)# 创建 Schemaschema=CollectionSchema(fields=[id_field,text_field,vector_field],description="知识库文档集合")# 创建 CollectionfrompymilvusimportCollection collection=Collection(name="knowledge_base",schema=schema,consistency_level="Strong"# 一致性级别)集合结构可视化:
┌─────────────────────────────────────────────────┐ │ Collection: knowledge_base │ ├────────┬──────────────────┬─────────────────────┤ │ id │ text │ embedding │ │ (PK) │ (VARCHAR) │ (FLOAT_VECTOR) │ ├────────┼──────────────────┼─────────────────────┤ │ 1 │ "向量数据库..." │ [0.12, -0.34, ...] │ │ 2 │ "HNSW索引..." │ [0.56, 0.78, ...] │ │ 3 │ "RAG检索..." │ [0.23, 0.45, ...] │ │ ... │ ... │ ... │ └────────┴──────────────────┴─────────────────────┘Step 3:创建索引
# 创建 HNSW 索引index_params={"index_type":"HNSW","metric_type":"COSINE","params":{"M":16,"efConstruction":256}}collection.create_index(field_name="embedding",index_params=index_params)Step 4:插入数据
importnumpyasnp# 模拟数据(实际项目中这里调用 Embedding 模型)texts=["向量数据库是一种专门用于存储和检索高维向量的数据库系统","HNSW 是一种基于图的近似最近邻搜索算法","RAG 技术通过检索增强生成来提升大模型的回答质量","Milvus 是全球最流行的开源向量数据库","余弦相似度是衡量两个向量方向相似程度的指标",]# 模拟 embedding(实际中应调用嵌入模型)embeddings=np.random.rand(5,1024).tolist()# 插入数据data=[texts,# text 字段embeddings# embedding 字段]result=collection.insert(data)print(f"插入成功,插入条数:{result.insert_count}")# 输出: 插入成功,插入条数: 5Step 5:加载集合 & 查询
# 加载集合到内存(必须!Milvus 查询前需要 load)collection.load()# 准备查询向量query_text="什么是向量数据库?"query_embedding=np.random.rand(1,1024).tolist()# 模拟查询向量# 执行搜索search_params={"metric_type":"COSINE","params":{"ef":128}}results=collection.search(data=query_embedding,anns_field="embedding",param=search_params,limit=3,# 返回 Top-3output_fields=["text"],# 返回原始文本consistency_level="Strong")# 打印结果forhitsinresults:forhitinhits:print(f"ID:{hit.id}, 距离:{hit.distance:.4f}, 文本:{hit.entity.get('text')}")输出示例:
ID: 1, 距离: 0.8523, 文本: 向量数据库是一种专门用于存储和检索高维向量的数据库系统 ID: 4, 距离: 0.7891, 文本: Milvus 是全球最流行的开源向量数据库 ID: 3, 距离: 0.6234, 文本: RAG 技术通过检索增强生成来提升大模型的回答质量📊 Milvus 核心概念速查
| 概念 | 说明 | 类比 |
|---|---|---|
| Collection | 数据集合 | MySQL 的 Table |
| Partition | 集合的分区 | 表的分区 |
| Segment | 数据段(内部自动管理) | 数据块 |
| Entity | 一条数据记录 | 一行数据 |
| Field | 字段 | 列 |
| Schema | 数据结构定义 | 表结构 |
| Index | 索引 | 数据库索引 |
⚙️ 一致性级别详解
Milvus 提供了4 种一致性级别,这是一个很多人忽略的重要配置:
| 一致性级别 | 说明 | 延迟 | 适用场景 |
|---|---|---|---|
| Strong | 强一致,写入立即可见 | 最高 | 金融、医疗等关键场景 |
| Session | 会话一致,同一会话内可见 | 较高 | 用户交互场景 |
| Bounded | 有界一致,允许短暂延迟 | 低⚡ | 大多数场景推荐 |
| Eventually | 最终一致 | 最低 | 对实时性要求不高的批量任务 |
# 推荐:大多数场景用 Bounded 就够了collection.search(...,consistency_level="Bounded"# 性能最优的选择)🔧 Attu:可视化管理工具
强烈推荐安装 Attu——Milvus 的 Web 管理界面 👇
# Docker 安装 Attudockerrun-d--nameattu\--attachable\--networkmilvus\-p8000:3000\-eMILVUS_URL=milvus:19530\zilliz/attu:latestAttu 能做什么:
| 功能 | 说明 |
|---|---|
| 📊 数据浏览 | 可视化查看集合中的数据 |
| 🔍 向量搜索 | 在界面上直接做向量查询 |
| 📈 性能监控 | 查看 QPS、延迟等指标 |
| ⚙️ 索引管理 | 创建/查看/删除索引 |
| 📋 系统信息 | 查看集群状态 |
⚠️ 新手常见坑
坑 1:忘记 load 就查询
# ❌ 错误:直接查询results=collection.search(...)# 报错!# ✅ 正确:先 loadcollection.load()results=collection.search(...)坑 2:向量维度不匹配
# ❌ 错误:集合定义 1024 维,插入 768 维collection.insert([texts,wrong_dim_embeddings])# 报错!# ✅ 正确:确保维度一致# 集合定义 dim=1024,嵌入模型输出也必须是 1024 维坑 3:不创建索引就查询
# ❌ 错误:不建索引就查询(走暴力搜索,极慢)results=collection.search(...)# ✅ 正确:先建索引collection.create_index("embedding",index_params)collection.load()results=collection.search(...)🔑 本篇核心要点回顾
| 要点 | 说明 |
|---|---|
| 安装 | Docker Compose 一键部署 |
| 核心流程 | 连接 → 建集合 → 建索引 → 插入 → Load → 查询 |
| 一致性级别 | 大多数场景用 Bounded 即可 |
| Attu | 强烈推荐安装的可视化工具 |
| 常见坑 | 忘记 load、维度不匹配、不建索引 |
✍️ 写在最后
Milvus 的上手其实很简单——10 行代码就能完成第一次向量查询。
但"能用"和"用好"之间,还隔着索引调优、分布式部署、性能监控等很多功课。
接下来的几篇,我们会继续实战其他向量数据库(Qdrant、Chroma、FAISS、Weaviate),最后来一个六大数据库横评,帮你做出最适合你项目的选择 🎯
📌下篇预告:《Qdrant 实战:Rust 写的向量数据库到底有多快?⚡》
💬有问题欢迎评论区讨论,觉得有用请点赞收藏 👍
作者:高炉炼铁智能化技术研究者,专注钢铁冶金与人工智能 交叉领域。
👍 如果觉得有帮助,请点赞、收藏、转发!
版权归作者所有,未经许可请勿抄袭,套用,商用(或其它具有利益性行为)。
🔔 关注专栏,不错过后续精彩内容