Milvus学习
@ 晚风 · Tuesday, May 13, 2025 · 2 分钟阅读 · 更新于 五月 13, 2025

学习Milvus数据库

Milvus 介绍

Milvus 是目前最受欢迎的开源向量数据库之一,专为存储与检索海量高维向量而设计。无论是文本语义搜索、以图搜图,还是多模态检索,Milvus 都能提供高性能、低延迟的检索能力。

1. 原理

Milvus 的核心目标是:

在海量高维向量集合中,以高性能、低延迟完成相似性搜索(Similarity Search)和向量检索(Vector Retrieval)

基本原理:

  1. 向量化表示(Vectorization) 原始数据(文本、图像、音频、视频等)通过 Embedding 模型 转换为固定维度的浮点向量。
  2. 相似度计算 向量之间的相似度通常使用:
    • 欧氏距离 (L2)
    • 余弦相似度 (Cosine)
    • 内积 (IP)
  3. 近似最近邻搜索(ANN) 通过 IVF、HNSW、DiskANN 等索引结构,在牺牲少量精度的情况下极大提升检索速度。
  4. 分布式存储与查询 通过 Sharding(分片)+ Replication(副本) 实现 PB 级数据存储与查询。

2. 架构

Milvus v2.x 的架构分为四层:

Access Layer
Coordinator Services
Worker Nodes
Storage Layer
  • Access Layer(访问层): 提供 gRPC / REST API,处理客户端请求、认证、负载均衡。

  • Coordinator Services(协调器):

    1. 接口介绍
    • DCL/DDL:处理数据定义语言 (DDL) 和数据控制语言 (DCL) 请求,如创建或删除 Collections、分区或索引
    • DML:数据操作,如插入、删除、更新数据
    • DQL:数据查询
    1. 模块介绍
    • RootCoord:管理集合、分区、元数据。
    • QueryCoord:调度查询节点,分发搜索任务。
    • DataCoord:管理数据写入、落盘、合并。
  • Worker Nodes(工作节点):

    • StreamingNode: 流节点,提供一致性保证和故障恢复、增长数据查询和生成查询计划。
    • QueryNode:执行向量检索。
    • DataNode:处理数据插入与分片。
    • IndexNode:构建 ANN 索引。
  • Storage Layer(存储):

    • 元数据(etcd)
    • 向量数据(MinIO / S3 / HDFS)
    • 日志与消息队列(Pulsar / Kafka)

    数据流和 API 类别

    Milvus API 按其功能分类,并遵循架构的特定路径:

    应用程序接口类别 操作符 示例应用程序接口 架构流程
    DDL/DCL Schema 和访问控制 createCollection,dropCollection,hasCollectioncreatePartition 访问层 → 协调器
    DML 数据操作 insert,deleteupsert 访问层 → 流工作节点
    数据查询 数据查询 search,query 访问层 → 批量工作节点(查询节点)

3. 关键词

关键词 说明
Vector Embedding 高维向量表示
ANN Approximate Nearest Neighbor
IVF 倒排文件索引
HNSW 分层小世界图索引
DiskANN 磁盘型 ANN 索引
Hybrid Search 向量+结构化混合检索
Sharding / Replication 分片与副本
Time Travel 历史版本查询
Load 磁盘->内存
Flush 内存->磁盘

4. 使用示例

from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType
import numpy as np

# 连接
connections.connect("default", host="localhost", port="19530")

# 定义 Schema
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=768)
]
schema = CollectionSchema(fields, description="Example collection")
collection = Collection(name="example", schema=schema)

# 插入数据
vectors = np.random.random((1000, 768)).astype(np.float32)
ids = list(range(1000))
collection.insert([ids, vectors])
collection.flush()

# 创建索引
collection.create_index(
    field_name="embedding",
    index_params={
        "metric_type": "L2",
        "index_type": "IVF_FLAT",
        "params": {"nlist": 128}
    }
)
collection.load()

# 搜索
query_vector = np.random.random((1, 768)).astype(np.float32)
results = collection.search(
    query_vector,
    "embedding",
    param={"nprobe": 10},
    limit=5
)
print(results)

5. 应用场景

场景 示例
AI 语义搜索 ChatGPT RAG 检索、知识库搜索
图像检索 电商商品相似图、以图搜图
视频检索 视频监控相似片段
音频检索 音乐识别、说话人检索
推荐系统 基于相似度的推荐
多模态搜索 图文混合搜索(CLIP Embedding)
法律/医学检索 案例匹配、病历相似度分析

6. 索引选择

Milvus 支持多种索引,不同数据规模、延迟、内存要求下的推荐如下:

索引类型 特点 优点 缺点 适用场景
FLAT 暴力搜索 精度 100% 延迟高 小数据集
IVF_FLAT 倒排 + 全扫描 性能与精度平衡 精度略低 中等规模数据
IVF_SQ8 IVF + 8位量化 节省内存 精度下降 内存受限场景
IVF_PQ IVF + 产品量化 超低内存 精度下降大 亿级向量库
HNSW 小世界图 高精度、低延迟 内存大 延迟要求高
DiskANN 磁盘索引 支持超大数据 稍慢 PB 级向量库

选择逻辑

小数据(<100万) → 要高精度 → FLAT  
                → 要快        → HNSW  

中大数据(百万-亿级) → 内存够,延迟敏感 → HNSW  
                      → 内存有限 → IVF_PQ / IVF_SQ8  
                      → 平衡速度和精度 → IVF_FLAT  

超大数据(>亿级) → 内存有限 → DiskANN  
                 → 内存充足、超高并发 → HNSW

7. 总结

Milvus 作为新一代向量数据库,通过分布式架构、灵活的索引类型以及多模态支持,为 AI 检索提供了高效的底层基础设施。 无论是搭建 RAG 系统,还是图像/视频/音频检索,Milvus 都能提供高性能 + 高扩展性的解决方案。 索引的选择需要结合数据规模、延迟、精度、内存资源综合评估,并建议通过实际测试找到最优配置。

关于我

❤️

姓名: lwz


性别: 男


年龄: 29


星座: 摩羯座


职业: python工程师


爱好: 秋、ps5、运动


主要的技术栈是:

  • python
  • 自动驾驶仿真验证

学习网站: leetcode


公司: 国科础石


– 2025 年 2 月 25 日更新

我的一些开源项目

等等?项目呢?不会没有吧??

其他

如果你喜欢我的开源项目或者它们可以给你带来帮助,可以赏一杯咖啡 ☕ 给我。~

It is better to attach some information or leave a message so that I can record the donation 📝, thank you very much 🙏.

社交链接