Milvus 是一个专注于向量数据库(Vector Database)的开源系统,它的设计目的是高效存储、管理和检索高维向量数据(如图像、文本、音频的特征向量)。它支持大规模向量的相似性搜索,并广泛应用于推荐系统、图像检索、自然语言处理等领域。
Milvus的核心概念
Database(数据库)
Milvus 的逻辑命名空间,类似于传统数据库系统中的数据库,用于隔离和组织数据集合(Collection)。
作用:提供数据的逻辑隔离,支持多租户,不同的数据库之间可以独立操作互不干扰。
用途:在同一个 Milvus 实例中存储不同业务线的数据,例如用户行为数据和商品特征数据。
Collection(集合)
存储高维向量和相关元数据的基本单位,类似于传统数据库中的“表”。每个 Collection 由 Schema 定义其结构。
作用:用于存储实际的数据,支持对数据的增、删、改、查等操作。
用途:在向量检索任务中,每个 Collection 通常表示一个特定的数据集,如用户向量、商品向量。
Schema(模式)
定义一个 Collection 的字段及其数据类型的规则和描述。
作用:规定集合中数据的字段类型、主键、向量维度等,确保插入数据符合规范,并优化存储和检索性能。
用途:用于定义向量字段(如 128 维浮点向量)和其他辅助字段(如整型主键或时间戳)。
Field(字段)
Collection 中的一个数据列,类似于表的列。
作用:定义字段名称、类型和特性(如是否为主键,是否自动生成主键)
支持的类型包括:标量字段:INT64、FLOAT、DOUBLE、VARCHAR 等;向量字段:FLOAT_VECTOR、BINARY_VECTOR。
用途:主键字段用于唯一标识数据记录。向量字段用于存储特征向量,用于相似性搜索。
Partition(分区)
Collection 的子集,用于数据的逻辑组织和分组。
作用:通过分区将数据按某些规则(如时间、类别)进行分组管理,提高查询性能和数据管理的灵活性。
用途:在电商应用中,可以按商品类别为一个集合创建多个分区,如“电子产品”、“服装”等。
Index(索引)
为向量字段创建的索引结构,用于加速向量相似性检索。
作用:优化向量的相似性搜索速度,在海量数据中实现毫秒级查询响应。
支持的索引类型:VF(倒排文件)、HNSW(分层图结构)、ANNOY(近似最近邻搜索)
用途:为存储在 Collection 中的高维向量数据提供快速的相似性搜索。
Metric(度量方式)
衡量向量之间相似度的方法。
作用:决定向量之间相似性的计算方式。
用途:选择适合具体应用的相似性度量方法,例如图像检索使用欧氏距离,推荐系统使用内积。
支持的度量方式:欧氏距离(Euclidean Distance)、内积(Dot Product)、余弦相似度(Cosine Similarity)、汉明距离(Hamming Distance)
Index File Size(索引文件大小)
决定了 Milvus 在构建索引之前将数据分块的大小。
作用:控制索引的粒度、平衡内存使用与检索性能。
用途:针对大数据集,合理配置索引文件大小,避免内存不足。
Query(查询)
在 Milvus 中对向量数据进行检索和过滤的操作。
作用:支持通过特定向量字段进行相似性搜索、允许基于标量字段添加过滤条件。
用途:结合向量字段和标量字段实现复杂的查询需求,如“查找与目标向量最相似的 10 个商品,但价格小于 100 的商品”。
Search(搜索)
基于向量字段的相似性搜索操作。
作用:根据提供的查询向量查找最相似的向量数据,支持返回 K 个最相似的结果。
用途:用于推荐系统、图像搜索、视频检索等场景。
Insert(插入)
向 Collection 中添加数据的操作。
作用:将向量及相关元数据存储到 Collection 中。
用途:将用户行为特征、商品特征等数据存储到指定的 Collection。
Delete(删除)
从 Collection 中删除指定数据的操作。
作用:支持基于主键或其他条件删除数据。
用途:清理旧数据或删除错误数据。
Flush(刷新)
内存中的数据同步到持久化存储中的操作。
作用:确保数据持久化,防止内存丢失。
用途:在插入大量数据后进行 Flush 操作,保证数据安全。
Compaction(数据整理)
合并多余的段,减少存储空间和提高查询性能的操作。
作用:清理无效数据(如删除标记的数据)。
用途:在频繁数据操作后运行 Compaction,优化存储和查询性能。
Segment(段)
Collection 的物理存储单元,用于存储实际的数据块。
作用:每个 Collection 中的数据分为若干个 Segment。Segment 是数据管理和查询优化的基础单元。
用途:在插入数据时,自动创建新的 Segment 并管理其生命周期。
Time Travel(时间穿越查询)
在指定时间点查看 Collection 数据的功能。
作用:支持按时间点进行数据的回溯查询。
用途:用于历史数据的分析和版本控制。
概念间的关系
关系层次图
Database (数据库)
├── Collection (集合)
│ ├── Schema (模式)
│ │ ├── Field (字段)
│ ├── Partition (分区)
│ ├── Segment (段)
│ │ ├── Index (索引)
│ │ └── 数据记录
└── Time Travel (时间穿越查询)
概念层次关系说明
我认为在概念层面向量数据库和关系数据库本身没有什么可比性,但是作为传统程序使用关系数据库的概念来理解Milvus可能更好理解。
在 Milvus 中,Schema、Database 和 Collection 是层次化的数据组织和定义概念,它们各自的职责和作用如下:
- Database(数据库)
- 最顶层逻辑容器,提供命名空间和数据隔离。
- 每个 Database 包含多个 Collections。
- 独立性:数据库之间的数据和操作互不干扰,适合不同的业务线或多租户场景。
- Collection(集合)
- Database 中的核心数据存储单元,存储具体的数据。
- Collection 是操作对象,例如插入、查询、删除等操作都针对 Collection。
- 每个 Collection 必须有一个 Schema 定义其结构。
- 一个 Collection 可以进一步划分为多个 Partitions,以逻辑分组数据。
- Schema(模式)
- 说明:定义单个Collection的结构,即字段的名称、类型、维度等
- Schema 包含多个 Fields,规定:
- 每个字段的名称、类型、是否为主键。
- 向量字段的维度(例如 128 维)。
- 作用关系:
- Schema 决定了 Collection 中可以存储什么样的数据。
- 插入的数据必须符合 Schema 规则。
- Field(字段)
- Collection 的数据列,每个 Field 是 Schema 的一部分。
- 不同 Field 存储不同类型的数据,如主键(ID)、时间戳、向量字段等。
- Field 的定义直接影响数据存储的查询效率,例如:
- 主键字段(唯一标识数据)。
- 向量字段(用于相似性搜索)。
- Partition(分区)
- Collection 的逻辑子集,用于对数据进一步组织和分组。
- Partition 的关系:
- 一个 Collection 可以有多个 Partitions。
- 每个 Partition 包含部分数据记录。
- 分区的作用:
- 提高查询性能。例如,可以按时间分区,只查询某些分区的数据。
- 管理数据。例如,将不同类别的数据存储到不同分区。
- Segment(段)
- Partition 的物理存储单元,存储实际的数据块。
- Segment 的关系:
- 一个 Partition 中包含多个 Segments。
- Segment 是插入数据时生成的基础单位,管理数据的生命周期。
- 作用关系:
- 提供并行化的数据存储和查询。
- 定期进行 Compaction(合并小段),提高性能。
- Index(索引)
- Segment 的附加结构,用于加速向量相似性搜索。
- 索引的关系:
- 每个 Segment 可以有一个或多个索引。
- 索引基于 Segment 的向量字段生成。
- 作用关系:
- 为 Collection 数据提供高效的相似性搜索。
- 不同的索引类型适用于不同的数据分布和搜索需求。
- Query/Search(查询/搜索)
- 操作级别的功能,用于对 Collection 中的数据进行检索。
- 查询的关系:
- 查询可以针对整个 Collection,也可以针对指定的 Partition。
- 查询结果基于向量字段的相似性,同时可以结合标量字段进行过滤。
- 作用关系:
- 与 Collection、Schema 和 Index 紧密相关。
- 检索效率和精度依赖于索引、分区以及字段的合理设计。
- Time Travel(时间穿越查询)
- 历史查询功能,允许在指定时间点查看 Collection 数据。
- 时间穿越查询的关系:
- 依赖于 Segment 的元数据和存储快照。
- 查询结果基于 Collection 和 Partition 的历史状态。
- 作用关系:
- 用于审计、数据版本控制和历史分析。
概念层次关系总结表
| 概念 | 上级关系 | 下级关系 | 作用 |
|---|---|---|---|
| Database | 顶层容器 | Collection | 提供逻辑命名空间,隔离不同业务线的数据。 |
| Collection | Database | Schema、Partition | 数据存储的核心单元,支持高维向量和标量字段的操作。 |
| Schema | Collection | Field | 定义 Collection 的字段结构,规定存储数据的规则。 |
| Field | Schema | 数据记录 | 定义字段名称、类型、主键属性和向量维度等。 |
| Partition | Collection | Segment | 按逻辑分组数据,提高查询效率和数据管理灵活性。 |
| Segment | Partition | Index | 数据的物理存储块,是数据插入和查询的基本单位。 |
| Index | Segment | - | 提高向量检索效率,支持多种索引算法(如 IVF、HNSW)。 |
| Query/Search | Collection、Partition | - | 支持向量检索和标量字段过滤,是 Milvus 的主要功能之一。 |
| Time Travel | Collection | Segment 快照 | 支持基于时间点的历史数据查询。 |
- 顶层管理逻辑:Database
- 数据库是最高级别的逻辑单位,管理多个集合(Collection)。
- 不同数据库间完全隔离,用于多租户或多业务线的场景。
- 数据存储核心:Collection
- Collection 是核心数据单元,所有插入、查询、删除等操作围绕它展开。
- 它的结构由 Schema 决定,数据被存储在多个 Partitions 和 Segments 中。
- 数据逻辑与物理组织:Partition 和 Segment
- Partition 是数据的逻辑分组。
- Segment 是数据的物理存储块,是索引和查询的直接操作对象。
- 查询加速工具:Index
- 为 Segment 的向量字段创建索引,加速大规模向量相似性搜索。
- 多功能数据检索:Query/Search
- 检索结合了向量字段的相似性搜索和标量字段的过滤。
- 历史数据支持:Time Travel
- 依赖 Segment 快照,支持历史版本的数据查询。