`Milvus` 是开源的分布式向量数据库，非常适合大规模的向量检索场景
## 非结构化数据、Embeddings 和 Milvus

[[非结构化数据]]（如文本、图像和音频）格式各异，蕴含丰富的潜在语义，因此分析起来极具挑战性。为了处理这种复杂性，Embeddings 被用来将非结构化数据转换成能够捕捉其基本特征的数字向量。然后将这些向量存储在向量数据库中，从而实现快速、可扩展的搜索和分析。

Milvus 提供强大的数据建模功能，使您能够将非结构化或多模式数据组织成结构化的 Collections。它支持多种数据类型，适用于不同的属性模型，包括常见的数字和字符类型、各种向量类型、数组、集合和 JSON，为您节省了维护多个数据库系统的精力。

![](https://milvus-docs.s3.us-west-2.amazonaws.com/assets/unstructured-data-embedding-and-milvus.png)




Milvus 提供三种部署模式，涵盖各种数据规模--从 Jupyter Notebooks 中的本地原型到管理数百亿向量的大规模 Kubernetes 集群：

- Milvus Lite 是一个 Python 库，可以轻松集成到您的应用程序中。作为 Milvus 的轻量级版本，它非常适合在 Jupyter Notebooks 中进行快速原型开发，或在资源有限的边缘设备上运行。
- Milvus Standalone 是单机服务器部署，所有组件都捆绑在一个 Docker 镜像中，方便部署。
- Milvus Distributed 可部署在 Kubernetes 集群上，采用云原生架构，专为十亿规模甚至更大的场景而设计。该架构可确保关键组件的冗余



## Milvus 为何如此迅速？
**硬件感知优化**：为了让 Milvus 适应各种硬件环境，我们专门针对多种硬件架构和平台优化
了其性能，包括 AVX 512、SIMD、GPU 和 NVMe SSD。

**高级搜索算法**：Milvus 支持多种内存和磁盘索引/搜索算法，包括 IVF、HNSW、DiskANN 等，所有这些算法都经过了深度优化。与 FAISS 和 HNSWLib 等流行实现相比，Milvus 的性能提高了 30%-70%。

**C++ 搜索引擎**向量数据库性能的 80% 以上取决于其搜索引擎。由于 [[C++]] 语言的高性能、底层优化和高效资源管理，Milvus 将 [C++] 用于这一关键组件。最重要的是，Milvus 集成了大量硬件感知代码优化，从汇编级向量到多线程并行化和调度，以充分利用硬件能力。

**面向列**：Milvus 是面向列的向量数据库系统。其主要优势来自数据访问模式。在执行查询时，面向列的数据库只读取查询中涉及的特定字段，而不是整行，这大大减少了访问的数据量。此外，对基于列的数据的操作可以很容易地进行向量化，从而可以一次性在整个列中应用操作，进一步提高性能。

## 是什么让 Milvus 具有如此高的可扩展性？

2022 年，Milvus 支持十亿级向量

Milvus 的[[云原生]]和高度[[解耦]]的系统架构确保了系统可以随着数据的增长而不断扩展：

![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/2a7f2c67419744cc915286cb0b7a6431~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5p625p625p625p6E5biI:q75.awebp?rk3s=f64ab15b&x-expires=1782136637&x-signature=5CT7tilRlSnxWnL4dGLv%2BUfk46s%3D)

Milvus 本身是完全无状态的，因此可以借助 Kubernetes 或公共云轻松扩展。此外，Milvus 的各个组件都有很好的解耦，其中最关键的三项任务--搜索、数据插入和索引/压实--被设计为易于并行化的流程，复杂的逻辑被分离出来。这确保了相应的查询节点、数据节点和索引节点可以独立地向上和向下扩展，从而优化了性能和成本效率。


### 一、什么是向量数据库？为什么需要 Milvus？

#### 1.1 传统数据库 vs 向量数据库

传统数据库（如 MySQL、PostgreSQL）擅长存储结构化数据（姓名、年龄、订单号），并通过关键词精确匹配或模糊查询（如 `LIKE '%叶文洁%'`）来检索信息。但这种“文本匹配”方式无法理解语义。

例如：

- 用户问：“谁最先联系外星文明？”
- 数据库里有句子：“叶文洁在红岸基地按下按钮，向半人马座α星发送了地球坐标。”
- 但因为没有“联系外星文明”这几个字，传统搜索可能找不到这条信息。

而**向量数据库**解决的是**语义相似性**问题。它把文字转化为高维数字向量（embedding），然后通过计算向量之间的距离（如余弦相似度）来判断语义是否相近。

> “谁最先联系外星文明？” 和 “叶文洁在红岸基地按下按钮，向半人马座α星发送了地球坐标” 在语义空间中非常接近，即使字面完全不同。

#### 1.2 常见向量数据库对比

目前主流向量数据库包括：

|数据库|特点|适用场景|
|---|---|---|
|**Milvus**|开源、高性能、支持分布式、专为 AI 设计|大规模生产环境、企业级应用|
|**Pinecone**|全托管 SaaS，易用但收费|快速原型、中小项目|
|**Weaviate**|支持图谱+向量，自带语义推理|知识图谱融合场景|
|**Qdrant**|Rust 编写，性能优异，开源|中小型项目、嵌入式部署|
|**FAISS**（Facebook）|库而非数据库，适合单机|研究、离线批处理|

**Milvus** 由 Zilliz 公司开发，是 CNCF（云原生基金会）毕业项目，专为海量向量检索优化，支持亿级向量秒级响应，且提供完善的 SDK（包括 Node.js），非常适合构建 RAG 系统。

  


## Milvus 支持的搜索类型
##### 1.3.1 基础向量检索 (ANN Search)

这是 Milvus 的核心功能之一，近似最近邻 (Approximate Nearest Neighbor, ANN) 检索。与需要计算全部数据的暴力检索（Brute-force Search）不同，ANN 检索利用预先构建好的索引，能够极速地从海量数据中找到与查询向量最相似的 Top-K 个结果。这是一种在速度和精度之间取得极致平衡的策略。

主要参数:  
anns_field: 指定要在哪个向量字段上进行检索。  
data: 传入一个或多个查询向量。  
limit (或 top_k): 指定需要返回的最相似结果的数量。  
search_params: 指定检索时使用的参数，例如距离计算方式 (metric_type) 和索引相关的查询参数。

##### 1.3.2 增强检索

在基础的 ANN 检索之上，Milvus 提供了多种增强检索功能，以满足更复杂的业务需求。

过滤检索 (Filtered Search)

在实际应用中，我们很少只进行单纯的向量检索。更常见的需求是“在满足特定条件的向量中，查找最相似的结果”，这就是过滤检索。它将向量相似性检索与标量字段过滤结合在一起。

工作原理：先根据提供的过滤表达式 (filter) 筛选出符合条件的实体，然后仅在这个子集内执行 ANN 检索。这极大地提高了查询的精准度。  
应用示例：  
电商：“检索与这件红色连衣裙最相似的商品，但只看价格低于 500 元且有库存的。”  
知识库：“查找与‘人工智能’相关的文档，但只从‘技术’分类下、且发布于 2023 年之后的文章中寻找。”  
范围检索 (Range Search)

有时我们关心的不是最相似的 Top-K 个结果，而是“所有与查询向量的相似度在特定范围内的结果”。

工作原理：范围检索允许定义一个距离（或相似度）的阈值范围。Milvus 会返回所有与查询向量的距离落在这个范围内的实体。  
应用示例：  
人脸识别：“查找所有与目标人脸相似度超过 0.9 的人脸”，用于身份验证。  
异常检测：“查找所有与正常样本向量距离过大的数据点”，用于发现异常。  
多向量混合检索 (Hybrid Search)

这是 Milvus 提供的一种极其强大的高级检索模式，它允许在一个请求中同时检索多个向量字段，并将结果智能地融合在一起。

工作原理：

并行检索：应用针对不同的向量字段（如一个用于文本语义的密集向量，一个用于关键词匹配的稀疏向量，一个用于图像内容的多模态向量）分别发起 ANN 检索请求。  
**结果融合 (Rerank)**：Milvus 使用一个重排策略（Reranker）将来自不同检索流的结果合并成一个统一的、更高质量的排序列表。常用的策略有 RRFRanker（平衡各方结果）和 WeightedRanker（可为特定字段结果加权）。  
应用示例：

多模态商品检索：用户输入文本“安静舒适的白色耳机”，系统可以同时检索商品的文本描述向量和图片内容向量，返回最匹配的商品。  
增强型 RAG: 结合密集向量（捕捉语义）和稀疏向量（精确匹配关键词），实现比单一向量更精准的文档检索效果。  
分组检索 (Grouping Search)

分组检索解决了一个常见的痛点：检索结果多样性不足。想象一下，你检索“机器学习”，返回的前 10 篇文章都来自同一本教科书不同章节。这显然不是理想的结果。

工作原理：分组检索允许指定一个字段（如 document_id）对结果进行分组。Milvus 会在检索后，确保返回的结果中每个组（每个 document_id）只出现一次（或指定的次数），且返回的是该组内与查询最相似的那个实体。  
应用示例：  
视频检索：检索“可爱的猫咪”，确保返回的视频来自不同的博主。  
文档检索：检索“数据库索引”，确保返回的结果来自不同的书籍或来源。  
通过这些灵活的检索功能组合，开发者可以构建出满足各种复杂业务需求的向量检索应用。
Milvus 支持各种类型的搜索功能，以满足不同用例的需求：

- [ANN 搜索](https://milvus.io/docs/zh/single-vector-search.md#Basic-search)：查找最接近查询向量的前 K 个向量。
- [过滤搜索](https://milvus.io/docs/zh/single-vector-search.md#Filtered-search)：在指定的过滤条件下执行 ANN 搜索。
- [范围搜索](https://milvus.io/docs/zh/single-vector-search.md#Range-search)：查找查询向量指定半径范围内的向量。
- [混合搜索](https://milvus.io/docs/zh/multi-vector-search.md)：基于多个向量场进行 ANN 搜索。
- [全文搜索](https://milvus.io/docs/zh/full-text-search.md)：基于 BM 25 的全文搜索。
- [Rerankers](https://milvus.io/docs/zh/weighted-ranker.md)：根据附加标准或辅助算法调整搜索结果顺序，完善初始 ANN 搜索结果。
- [获取](https://milvus.io/docs/zh/get-and-scalar-query.md#Get-Entities-by-ID)：根据主键检索数据。
- [查询](https://milvus.io/docs/zh/get-and-scalar-query.md#Use-Basic-Operators)使用特定表达式检索数据。

## 综合功能集

除了上述主要搜索功能外，Milvus 还提供了一系列围绕 ANN 搜索实现的功能，以便您能充分利用其功能。

#### 基本概念

以下介绍下向量数据库的基本概念，以便快速了解。想要深入研究请看官网：[Milvus.io/docs/zh/cre…](https://link.juejin.cn?target=https%3A%2F%2FMilvus.io%2Fdocs%2Fzh%2Fcreate-collection.md "https://Milvus.io/docs/zh/create-collection.md")
可以用一个图书馆的比喻来理解 Collection：

Collection (集合): 相当于一个图书馆，是所有数据的顶层容器。一个 Collection 可以包含多个 Partition，每个 Partition 可以包含多个 Entity。  
Partition (分区): 相当于图书馆里的不同区域（如“小说区”、“科技区”），将数据物理隔离，让检索更高效。  
Schema (模式): 相当于图书馆的图书卡片规则，定义了每本书（数据）必须登记哪些信息（字段）。  
Entity (实体): 相当于一本具体的书，是数据本身。  
Alias (别名): 相当于一个动态的推荐书单（如“本周精选”），它可以指向某个具体的 Collection，方便应用层调用，实现数据更新时的无缝切换。  
Collection 是 Milvus 中最基本的数据组织单位，类似于关系型数据库中的一张**表 (Table)**。是我们存储、管理和查询向量及相关元数据的容器。所有的数据操作，如插入、删除、查询等，都是围绕 Collection 展开的。

一个 Collection 由其 Schema 定义，并包含以下重要的子概念和特性：
##### 数据库（Database）

数据库是**组织和管理数据的逻辑单元**。你可以创建多个数据库，为不同的应用程序或租户从逻辑上隔离数据

##### 集合(Collection)

向量**数据存放的容器**，相当于数据库中的表

- 所有向量按照业务存储在 `collection` 里
- 每个 `collection` 有固定的 Schema 结构
- 增删改查都在 `collection` 上操作



##### 1.1.1 Schema

在创建 Collection 之前，必须先定义它的 Schema。 Schema 规定了 Collection 的数据结构，定义了其中包含的所有字段 (Field) 及其属性。一个设计良好的 Schema 对于保证数据一致性和提升查询性能至关重要。

Schema 通常包含以下几类字段：

主键字段 (Primary Key Field): 每个 Collection 必须有且仅有一个主键字段，用于唯一标识每一条数据（实体）。它的值必须是唯一的，通常是整数或字符串类型。  
向量字段 (Vector Field): 用于存储核心的向量数据。一个 Collection 可以有一个或多个向量字段，以满足多模态等复杂场景的需求。  
标量字段 (Scalar Field): 用于存储除向量之外的元数据，如字符串、数字、布尔值、JSON 等。这些字段可以用于过滤查询，实现更精确的检索。

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4a9532a74d66499d847202d2988b4b17.png)  
上图以一篇新闻文章为例，生动地展示了一个典型的多模态、混合向量 Schema 设计。它将一篇文章拆解为：唯一的 Article (ID)、文本元数据（如 Title、Author Info）、图像信息（Image URL），并为图像和摘要内容分别生成了密集向量（Image Embedding, Summary Embedding）和稀疏向量（Summary Sparse Embedding）。

##### 字段（Field）



相当于 `mysql` 表中的**列**，一个集合有：

- 主键字段（必须）
- 向量字段（必须，指定维度 `dim`）
- 其他标量字段（`int` / `string` / `bool` 等）

##### 实体（Entity）

**一行数据**、有主键 ID+向量+标量字段

##### 向量（Vector）

**浮点数组**，如[0.1, 0.2, 0.3, ..., 0.768]。由模型（`BGE`）把文本、图片、音频转成**特征表示**。常见维度：**768、1024、1536**

##### 分区（Partition）

分区是**集合的子集**，对集合做**数据分组**。当创建一个集合时，默认会创建一个 **\_default** 的分区。如果不增加其他分区，插入到集合的实体数据都会进入默认分区。创建分区会加快查询，缩小扫描范围.
我们可以根据业务需求创建更多的分区，将数据按特定规则（如类别、日期等）存入不同分区。

为什么使用分区？

提升查询性能: 在查询时，可以指定只在一个或几个分区内进行搜索，从而大幅减少需要扫描的数据量，显著提升检索速度。  
数据管理: 便于对部分数据进行批量操作，如加载/卸载特定分区到内存，或者删除整个分区的数据。  
一个 Collection 最多可以有 1024 个分区。合理利用分区是 Milvus 性能优化的重要手段之一。

##### 1.1.3 Alias (别名)

Alias (别名) 是为 Collection 提供的一个“昵称”。通过为一个 Collection 设置别名，我们可以在应用程序中使用这个别名来执行所有操作，而不是直接使用真实的 Collection 名称。

为什么使用别名？

安全地更新数据：想象一下，你需要对一个在线服务的 Collection 进行大规模的数据更新或重建索引。直接在原 Collection 上操作风险很高。正确的做法是：  
创建一个新的 Collection (collection_v 2) 并导入、索引好所有新数据。  
将指向旧 Collection (collection_v 1) 的别名（例如 my_app_collection）原子性地切换到新 Collection (collection_v 2) 上。  
代码解耦：整个切换过程对上层应用完全透明，无需修改任何代码或重启服务，实现了数据的平滑无缝升级

##### 索引（Index）

**快速检索结构**，没有索引全表遍历很慢，有了索引加快搜索速度

如果说 Collection 是 Milvus 的骨架，那么索引 (Index) 就是其加速检索的神经系统。从宏观上看，索引本身就是一种为了加速查询而设计的复杂数据结构。对向量数据创建索引后，Milvus 可以极大地提升向量相似性搜索的速度，代价是会占用额外的存储和内存资源。

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0eff25d6c6fa4123bbb7e28785a0b9d4.png)  
上图清晰地展示了 Milvus 向量索引的内部组件及其工作流程：

数据结构：这是索引的骨架，定义了向量的组织方式（如 HNSW 中的图结构）。  
量化(可选)：数据压缩技术，通过降低向量精度来减少内存占用和加速计算。  
结果精炼(可选)：在找到初步候选集后，进行更精确的计算以优化最终结果。  
Milvus 支持对标量字段和向量字段分别创建索引。

标量字段索引：主要用于加速元数据过滤，常用的有 INVERTED、BITMAP 等。通常使用推荐的索引类型即可。  
向量字段索引：这是 Milvus 的核心。选择合适的向量索引是在查询性能、召回率和内存占用之间做出权衡的艺术。

##### 1.2.1 主要向量索引类型

FLAT (精确查找)

原理：暴力搜索（Brute-force Search）。它会计算查询向量与集合中所有向量之间的实际距离，返回最精确的结果。  
优点：100% 的召回率，结果最准确。  
缺点：速度慢，内存占用大，不适合海量数据。  
适用场景：对精度要求极高，且数据规模较小（百万级以内）的场景。

  IVF 系列 (倒排文件索引)

原理：类似于书籍的目录。它首先通过聚类将所有向量分成多个“桶”(nlist)，查询时，先找到最相似的几个“桶”，然后只在这几个桶内进行精确搜索。IVF_FLAT、IVF_SQ 8、IVF_PQ 是其不同变体，主要区别在于是否对桶内向量进行了压缩（量化）。  
优点：通过缩小搜索范围，极大地提升了检索速度，是性能和效果之间很好的平衡。  
缺点：召回率不是 100%，因为相关向量可能被分到了未被搜索的桶中。  
适用场景：通用场景，尤其适合需要高吞吐量的大规模数据集。

**IVF_FLAT**: 先将向量聚类分桶，再查桶，快、常用。

**解释**：如果把向量比做成书籍的话。这个算法（`IVF`）就是通过 K-Means 将书籍进行归类（分区），把书籍放在不同的书架。具体会划分多少书架，得看设置的 `nlist`，`nlist` 是多少，就会将书籍划分成多少个书架。所以在进行向量检索的时候，只需要检索相近的几个分区就能快速的找到向量了。设置 `nprobe`, `nprobe` 代表检索相近几个分区。`FLAT` 则是完整保存向量，不压缩，比对距离时是精准原始计算，没有精度损耗。

  
**IVF_SQ 8**: 对向量压缩，省内存，精度略降

**解释**：在分区的逻辑上和 `IVF_FLAT` 一样，唯一的区别是对向量进行了高强度压缩，只保留核心特征，丢掉了微小的细节。所以这种索引节省了大量的内存空间.

**HNSW**: 基于图结构，查询最快，精度最高，耗内存

**解释**: 每个向量都与其他向量相连，组成一个超大的关系网络图，多层立体地图。向量完整原始保存，不压缩，不分区。向量检索通过地图进行跳跃查找。
原理：构建一个多层的邻近图。查询时从最上层的稀疏图开始，快速定位到目标区域，然后在下层的密集图中进行精确搜索。  
优点：检索速度极快，召回率高，尤其擅长处理高维数据和低延迟查询。  
缺点：内存占用非常大，构建索引的时间也较长。  
适用场景：对查询延迟有严格要求（如实时推荐、在线搜索）的场景。

**SCANN**: 平衡速度与精度，高召回场景用

**解释**：结合了以上 `IVF`、`SQ8`、`HNSW` 的优点：

0. 先像 `IVF` 一样：**划分大区、粗分区**，先大范围缩小搜索范围
1. 再像 `SQ8` 一样：**局部向量压缩**，控制内存
2. 最后像 `HNSW` 一样：在分区内部，**搭建小型邻居网络图**，精细快速检索

  
**DISKANN**: 磁盘级图索引，向量落盘存储，适合海量向量+ `SSD` 环境

**解释**：把向量本体全部存在磁盘，内存只留导航索引，用磁盘换容量、省机器内存，速度略弱 `HNSW`，远超 IVF 系列，是超大规模向量库的低成本方案。
原理：一种为在 SSD 等高速磁盘上运行而优化的图索引。  
优点：支持远超内存容量的海量数据集（十亿级甚至更多），同时保持较低的查询延迟。  
缺点：相比纯内存索引，延迟稍高。  
适用场景：数据规模巨大，无法全部加载到内存的场景。
**官方案例**：

默认情况下，`Milvus` 会禁用 `DISKANN`，以优先提高内存中索引的速度，以适应 `RAM` 中的数据集。

  
**总结**

索引的选择：

| 场景                       | 索引       |
| ------------------------ | -------- |
| 数据量小，追求绝对精准，不在乎速度        | FLAT     |
| 常规业务，百万级向量，平衡好用          | IVF_FLAT |
| 海量向量，内存紧张                | IVF_SQ 8 |
| 线上高并发、接口低延迟、不差内存         | HNSW     |
| 海量向量、高召回、省内存、速度快         | SCANN    |
| 海量向量、内存极小、依赖高速 SSD、低成本扩容 | DISKANN  |

##### 相似度量（Metric Type）

`Milvus` 通过不同的距离计算方式，判断两个向量之间的相似度，三种常用度量规则如下：

- **L 2(欧式距离)** ：计算向量空间直线距离，数值越小，向量越相似
- **IP(内积)** ：计算向量关联程度，数值越大，向量越相似
- **CONSINE(余弦)** ：直比对向量方向，不关注长度，数值越大，语义/特征越相似

##### 检索（Search）

向量检索即相速度查询：业务传入一个目标查询向量，`Milvus` 根据选定的向量相似度度量公式，在向量索引中快速比对所有向量，最终返回 `TOP-K` 相似度最高的匹配结果。

[创建 Collections | Milvus 文档](https://milvus.io/docs/zh/create-collection.md)