目录
  1. 1. 目录
  2. 2. 项目速览
  3. 3. 功能概述
    1. 3.1. 存算分离的云原生架构
    2. 3.2. 多种向量索引与 GPU 加速
    3. 3.3. 稀疏向量与全文检索
    4. 3.4. 多租户与安全
    5. 3.5. 实时流式更新与高可用
  4. 4. 适用场景
    1. 4.1. 大规模 RAG 知识库(亿级文档)
    2. 4.2. 推荐系统与相似商品搜索
    3. 4.3. 图像与视频以图搜图
    4. 4.4. 生物信息学与药物发现
    5. 4.5. 网络安全与异常检测
  5. 5. 快速上手
    1. 5.1. 环境要求
    2. 5.2. 安装
    3. 5.3. 最简示例:Lite 模式
    4. 5.4. 使用 HNSW 索引
  6. 6. 源码架构
  7. 7. 实操 Demo
  8. 8. 同类对比
  9. 9. 参考资源
Milvus — 云原生高性能向量数据库

GitHub: milvus-io/milvus
Stars: 44,800+ | Language: Go (59.3%), Python (19.7%), C++ (19.4%) | License: Apache 2.0
官网: milvus.io | 最新版本: v2.6.18 (2026-06-05)

目录

  1. 项目速览
  2. 功能概述
  3. 适用场景
  4. 快速上手
  5. 源码架构
  6. 实操 Demo
  7. 同类对比
  8. 参考资源

项目速览

Milvus 由 Zilliz 公司于 2019 年开源,是 LF AI & Data 基金会旗下的顶级毕业项目,也是全球 Star 数最高的向量数据库。截至 2026 年 6 月,项目在 GitHub 上已累计获得超过 44,800 颗 Star、164 个 Release 和近 25,000 次 Commit。Zilliz 同时提供基于 Milvus 的全托管云服务 Zilliz Cloud。

Milvus 采用”存算分离”的云原生架构,将向量数据库拆分为接入层、协调服务、工作节点和对象存储四个独立组件,每个组件均可独立弹性伸缩。这种架构天然适配 Kubernetes 环境,支持从单机开发到跨数百节点的大规模集群部署。Milvus 在向量 ANN 检索的性能方面进行了大量深度优化,支持 HNSW、IVF、FLAT、SCANN、DiskANN 以及 GPU 加速(NVIDIA CAGRA)等多种索引类型,可满足不同场景下的精度和性能权衡需求。

Milvus 2.6 版本进一步强化了全文检索与混合搜索能力,内置 BM25、SPLADE 和 BGE-M3 等稀疏向量模型支持,实现了稠密向量语义检索与稀疏向量关键词检索的一体化融合。

功能概述

存算分离的云原生架构

Milvus 的核心架构设计遵循”存算分离”原则,由四层组成:

  • 接入层(Proxy):负载均衡、请求路由、协议转换
  • 协调服务(Coordinator):集群拓扑管理、数据分配、DDL 执行
  • 工作节点(Worker Node):执行查询、构建索引、数据持久化
  • 对象存储(Object Storage):MinIO / S3 / Azure Blob,存储日志快照和索引文件

这种架构带来的直接好处是各组件的独立水平扩展——当查询负载上升时只需扩容工作节点,存储需求增加时只需扩展对象存储,各层互不影响。

多种向量索引与 GPU 加速

Milvus 提供业界最丰富的向量索引选择:

索引类型 适用场景 特点
FLAT 追求 100% 召回 暴力搜索,不压缩
IVF_FLAT 中等规模(百万级) 倒排索引 + 原始向量
IVF_PQ 大规模(亿级) 倒排索引 + 乘积量化
IVF_SQ8 中等规模 倒排索引 + 标量量化
HNSW 高精度、低延迟 层级可导航小世界图
SCANN Google 出品 各向异性向量量化
DiskANN 超大规模(十亿级) Vamana 图 + SSD 存储
GPU CAGRA GPU 加速 NVIDIA RAFT 库

稀疏向量与全文检索

Milvus 2.4+ 原生支持稀疏向量,可将 BM25、SPLADE 和 BGE-M3 等稀疏编码模型产生的向量直接存入 Milvus,与稠密向量在同一查询中进行混合检索。查询时可以指定 anns_field(向量检索字段)和 sparse_anns_field(稀疏检索字段),通过加权融合两路召回结果。

多租户与安全

Milvus 提供数据库级(Database)、集合级(Collection)、分区级(Partition)和分区键级(Partition Key)四种粒度的多租户隔离方案。安全方面,从 Milvus 2.4 起强制用户认证,支持 TLS 传输加密和基于角色的访问控制(RBAC),满足企业级安全合规要求。

实时流式更新与高可用

Milvus 支持数据的实时插入和更新(Upsert),通过 Write-Ahead Log 机制保证数据可靠性和一致性。主从复制(Replica)确保查询节点的高可用,单节点故障不影响整体服务。

适用场景

大规模 RAG 知识库(亿级文档)

当企业知识库的文档量达到数千万甚至上亿级别时,Milvus 的分布式架构和多索引策略可以完美支撑。结合 DiskANN 索引将热数据置内存、冷数据落 SSD,在成本和性能间取得最优平衡。

推荐系统与相似商品搜索

电商、短视频和社交平台的核心场景。Milvus 的实时更新能力支持用户行为向量(点击、购买、观看时长)的毫秒级写入和检索,GPU 加速进一步降低在线推理延迟。

图像与视频以图搜图

利用 CLIP、DINOv2 等模型将图像映射为向量存入 Milvus,通过向量 ANN 检索实现以图搜图、相似版权检测、视频去重等应用。Milvus 的标量过滤能力可以在向量检索的同时对图片标签、上传时间等结构化字段进行筛选。

生物信息学与药物发现

蛋白质序列、分子指纹和基因表达数据均可向量化后在 Milvus 中进行近似搜索。Milvus 对十亿级向量的大规模检索能力使其在蛋白质结构预测、分子相似性搜索等场景中广泛应用。

网络安全与异常检测

将网络流量日志、系统调用序列和用户行为轨迹向量化后存入 Milvus,通过向量相似度检索快速发现与已知攻击模式相似的异常行为。

快速上手

环境要求

  • Python 3.8+

安装

Milvus 提供多种部署模式:

Lite 模式(推荐用于开发/测试,零依赖):

pip install -U pymilvus

Lite 模式下 Milvus 直接嵌入 Python 进程,数据存储在本地文件中,无需 Docker 或 K8s。

Docker 单机模式:

wget https://github.com/milvus-io/milvus/releases/download/v2.6.18/milvus-standalone-docker-compose.yml -O docker-compose.yml
docker compose up -d

最简示例:Lite 模式

from pymilvus import MilvusClient

# 1. 创建 Lite 客户端(数据存储在当前目录的 milvus_demo.db 文件)
client = MilvusClient("milvus_demo.db")

# 2. 创建集合
client.create_collection(
collection_name="demo_collection",
dimension=768 # 向量维度
)

# 3. 插入数据
data = [
{
"id": i,
"vector": [float(i % 100) / 100] * 768, # 示例向量
"text": f"This is document number {i}",
"subject": "history" if i % 2 == 0 else "science"
}
for i in range(1000)
]
res = client.insert(collection_name="demo_collection", data=data)
print(f"插入了 {res['insert_count']} 条数据")

# 4. 语义检索
query_vectors = [[float(50) / 100] * 768]
results = client.search(
collection_name="demo_collection",
data=query_vectors,
limit=5,
output_fields=["text", "subject"]
)

for hits in results:
for hit in hits:
print(f" id={hit['id']}, distance={hit['distance']:.4f}, text={hit['entity']['text']}")

使用 HNSW 索引

from pymilvus import MilvusClient, DataType

client = MilvusClient("milvus_hnsw.db")

# 创建集合时指定 schema 和索引
schema = client.create_schema(auto_id=False, enable_dynamic_field=True)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=768)
schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=512)

index_params = client.prepare_index_params()
index_params.add_index(
field_name="vector",
index_type="HNSW", # HNSW 索引
metric_type="COSINE", # 余弦相似度
params={"M": 16, "efConstruction": 200}
)

client.create_collection(
collection_name="hnsw_collection",
schema=schema,
index_params=index_params
)

源码架构

Milvus 仓库采用 Go 为主的 monorepo 结构,核心代码位于 internal/ 目录:

milvus/
├── cmd/ # 入口程序
│ ├── milvus/ # Milvus 主服务入口
│ ├── components/ # 组件入口(proxy/query/index/data)
│ └── tools/ # 运维工具
├── internal/ # 核心业务逻辑
│ ├── proxy/ # 接入层:请求路由、鉴权、限流
│ ├── querycoord/ # 查询协调器:任务调度、副本管理
│ ├── querynode/ # 查询节点:向量检索执行引擎
│ ├── datacoord/ # 数据协调器:segment 管理、垃圾回收
│ ├── datanode/ # 数据节点:WAL 写入、数据持久化
│ ├── indexcoord/ # 索引协调器:索引构建任务分配
│ ├── indexnode/ # 索引节点:索引构建与存储
│ ├── rootcoord/ # 根协调器:元数据管理、DDL 执行
│ ├── storage/ # 对象存储抽象层
│ ├── mq/ # 消息队列抽象(Pulsar/Kafka)
│ └── types/ # 统一类型定义
├── pkg/ # 公共库
│ ├── common/ # 通用工具
│ ├── log/ # 日志库
│ ├── metrics/ # 监控指标
│ └── util/ # 辅助函数
├── client/ # Python SDK(pymilvus)
│ └── pymilvus/ # ORM 风格 API
├── configs/ # 配置文件
├── deployments/ # 部署清单
├── build/ # 构建脚本
├── tests/ # 集成测试
├── docs/ # 文档
└── go.mod / Makefile # Go 构建配置
  • internal/proxy:作为整个系统的唯一入口,负责鉴权、请求验证、协议转换(gRPC/REST),并将请求路由到对应的协调器。
  • internal/querynode:查询执行的核心,运行在 C++ 级别的向量索引之上,支持多索引类型切换、标量过滤下推和结果融合。
  • internal/datanode/datacoord:数据写入路径。数据经 Proxy 验证后写入消息队列(Pulsar/Kafka),DataNode 消费消息并生成 segment,DataCoord 负责 segment 的生命周期管理。
  • internal/indexnode/indexcoord:索引构建与查询使用分离,IndexNode 异步构建索引,构建完成的通知由 IndexCoord 广播至所有 QueryNode。
  • internal/rootcoord:DDL 操作(创建/删除 Collection、Partition、Index)、时间戳分配和全局元数据持久化。
  • internal/storage:对象存储抽象层,支持 MinIO、AWS S3、Azure Blob Storage 和本地磁盘。

实操 Demo

以下是使用 Milvus Lite 构建一个完整的电影搜索 RAG Demo:

"""
电影语义搜索 Demo
功能:创建电影向量库 → 插入数据 → 语义搜索 → 结果展示
"""

from pymilvus import MilvusClient
import numpy as np

# 1. 创建 Milvus Lite 客户端
print("[1/4] 正在初始化 Milvus Lite...")
client = MilvusClient("movies_demo.db")

# 2. 创建电影集合
print("[2/4] 正在创建电影集合...")
client.create_collection(
collection_name="movies",
dimension=128 # 为演示目的使用 128 维
)

# 3. 插入电影数据(实际场景中向量由 Embedding 模型生成)
print("[3/4] 正在插入电影数据...")
np.random.seed(42)

movies = [
{"id": 1, "title": "The Matrix", "genre": "Sci-Fi",
"vector": np.random.randn(128).tolist()},
{"id": 2, "title": "Inception", "genre": "Sci-Fi",
"vector": np.random.randn(128).tolist()},
{"id": 3, "title": "Interstellar", "genre": "Sci-Fi/Drama",
"vector": np.random.randn(128).tolist()},
{"id": 4, "title": "The Notebook", "genre": "Romance",
"vector": np.random.randn(128).tolist()},
{"id": 5, "title": "Titanic", "genre": "Romance/Drama",
"vector": np.random.randn(128).tolist()},
{"id": 6, "title": "The Dark Knight", "genre": "Action",
"vector": np.random.randn(128).tolist()},
{"id": 7, "title": "Pulp Fiction", "genre": "Crime",
"vector": np.random.randn(128).tolist()},
{"id": 8, "title": "Blade Runner 2049", "genre": "Sci-Fi",
"vector": np.random.randn(128).tolist()},
]

client.insert(collection_name="movies", data=movies)
print(f" 已插入 {len(movies)} 部电影")

# 4. 语义搜索
print("[4/4] 正在搜索...\n")
query = np.random.randn(128).tolist()

# 无过滤搜索
results = client.search(
collection_name="movies",
data=[query],
limit=3,
output_fields=["title", "genre"]
)

print("=== 语义搜索 TOP 3(无过滤)===")
for hits in results:
for hit in hits:
print(f" {hit['entity']['title']:20s} | {hit['entity']['genre']:15s} | score={hit['distance']:.4f}")

# 带过滤搜索:只看 Sci-Fi 类别
print("\n=== 语义搜索 TOP 3(仅 Sci-Fi)===")
results_filtered = client.search(
collection_name="movies",
data=[query],
limit=3,
filter='genre like "Sci-Fi%"',
output_fields=["title", "genre"]
)
for hits in results_filtered:
for hit in hits:
print(f" {hit['entity']['title']:20s} | {hit['entity']['genre']:15s} | score={hit['distance']:.4f}")

# 清理
client.drop_collection("movies")
print("\nDemo 完成!")

同类对比

特性 Milvus Qdrant Weaviate Chroma
Stars 44,800+ 32,300+ 16,300+ 28,400+
核心语言 Go + C++ Rust Go Rust
架构模型 存算分离 + 云原生 嵌入式 / 分布式 嵌入式 / 分布式 嵌入式 / Client-Server
分布式扩展 水平分片 + K8s 原生 水平分片 + Raft 共识 水平扩展 + 复制 Chroma Cloud
向量索引 FLAT/IVF/HNSW/SCANN/DiskANN/GPU HNSW HNSW/Flat/PQ/BQ HNSW
稀疏向量 原生支持(BM25/SPLADE/BGE-M3) 支持 BM25 混合检索 Chroma Cloud 支持
GPU 加速 NVIDIA CAGRA NVIDIA/AMD
多租户 Database/Collection/Partition/Key Collection/Payload Collection/Tenant Collection
安全认证 强制认证 + TLS + RBAC API Key + TLS API Key + OIDC + RBAC API Key(Cloud)
部署复杂度 中高 中等 极低
适用规模 千万~千亿级 百万~亿级 万~亿级 万~百万级

分析:Milvus 在向量数据库领域处于绝对的头部位置,无论是社区规模、功能完整度还是性能优化深度,都达到了业界最高水平。它的存算分离架构和 GPU 加速能力面对十亿级乃至千亿级向量场景时优势显著。但高能力意味着高复杂度——K8s 部署、组件协调、资源规划都需要专业的运维知识。对于大规模生产系统,Milvus 是目前最成熟的选择;对于中小型项目,可优先使用 Milvus Lite 或 Chroma 等更轻量的方案。Milvus 2.6 引入的全新 Python SDK(MilvusClient)显著降低了使用门槛,Lite 模式让开发者在本地也能享受 Milvus 的全功能体验。

参考资源

文章作者: Leo·Cheung
文章链接: http://tufusi.com/2026/06/15/SKILL-Milvus/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ONE·PIECE
打赏
  • 微信
  • 支付宝

评论