认识Milvus向量数据库

385 阅读9分钟

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 是层次化的数据组织和定义概念,它们各自的职责和作用如下:

  1. Database(数据库)
  • 最顶层逻辑容器,提供命名空间和数据隔离。
  • 每个 Database 包含多个 Collections。
  • 独立性:数据库之间的数据和操作互不干扰,适合不同的业务线或多租户场景。
  1. Collection(集合)
  • Database 中的核心数据存储单元,存储具体的数据。
  • Collection 是操作对象,例如插入、查询、删除等操作都针对 Collection。
  • 每个 Collection 必须有一个 Schema 定义其结构。
  • 一个 Collection 可以进一步划分为多个 Partitions,以逻辑分组数据。
  1. Schema(模式)
  • 说明:定义单个Collection的结构,即字段的名称、类型、维度等
  • Schema 包含多个 Fields,规定:
    • 每个字段的名称、类型、是否为主键。
    • 向量字段的维度(例如 128 维)。
  • 作用关系:
    • Schema 决定了 Collection 中可以存储什么样的数据。
    • 插入的数据必须符合 Schema 规则。
  1. Field(字段)
  • Collection 的数据列,每个 Field 是 Schema 的一部分。
  • 不同 Field 存储不同类型的数据,如主键(ID)、时间戳、向量字段等。
  • Field 的定义直接影响数据存储的查询效率,例如:
    • 主键字段(唯一标识数据)。
    • 向量字段(用于相似性搜索)。
  1. Partition(分区)
  • Collection 的逻辑子集,用于对数据进一步组织和分组。
  • Partition 的关系:
    • 一个 Collection 可以有多个 Partitions。
    • 每个 Partition 包含部分数据记录。
  • 分区的作用:
    • 提高查询性能。例如,可以按时间分区,只查询某些分区的数据。
    • 管理数据。例如,将不同类别的数据存储到不同分区。
  1. Segment(段)
  • Partition 的物理存储单元,存储实际的数据块。
  • Segment 的关系:
    • 一个 Partition 中包含多个 Segments。
    • Segment 是插入数据时生成的基础单位,管理数据的生命周期。
  • 作用关系:
    • 提供并行化的数据存储和查询。
    • 定期进行 Compaction(合并小段),提高性能。
  1. Index(索引)
  • Segment 的附加结构,用于加速向量相似性搜索。
  • 索引的关系:
    • 每个 Segment 可以有一个或多个索引。
    • 索引基于 Segment 的向量字段生成。
  • 作用关系:
    • 为 Collection 数据提供高效的相似性搜索。
    • 不同的索引类型适用于不同的数据分布和搜索需求。
  1. Query/Search(查询/搜索)
  • 操作级别的功能,用于对 Collection 中的数据进行检索。
  • 查询的关系:
    • 查询可以针对整个 Collection,也可以针对指定的 Partition。
    • 查询结果基于向量字段的相似性,同时可以结合标量字段进行过滤。
  • 作用关系:
    • 与 Collection、Schema 和 Index 紧密相关。
    • 检索效率和精度依赖于索引、分区以及字段的合理设计。
  1. Time Travel(时间穿越查询)
  • 历史查询功能,允许在指定时间点查看 Collection 数据。
  • 时间穿越查询的关系:
  • 依赖于 Segment 的元数据和存储快照。
  • 查询结果基于 Collection 和 Partition 的历史状态。
  • 作用关系:
    • 用于审计、数据版本控制和历史分析。

概念层次关系总结表

概念上级关系下级关系作用
Database顶层容器Collection提供逻辑命名空间,隔离不同业务线的数据。
CollectionDatabaseSchema、Partition数据存储的核心单元,支持高维向量和标量字段的操作。
SchemaCollectionField定义 Collection 的字段结构,规定存储数据的规则。
FieldSchema数据记录定义字段名称、类型、主键属性和向量维度等。
PartitionCollectionSegment按逻辑分组数据,提高查询效率和数据管理灵活性。
SegmentPartitionIndex数据的物理存储块,是数据插入和查询的基本单位。
IndexSegment-提高向量检索效率,支持多种索引算法(如 IVF、HNSW)。
Query/SearchCollection、Partition-支持向量检索和标量字段过滤,是 Milvus 的主要功能之一。
Time TravelCollectionSegment 快照支持基于时间点的历史数据查询。
  1. 顶层管理逻辑:Database
  • 数据库是最高级别的逻辑单位,管理多个集合(Collection)。
  • 不同数据库间完全隔离,用于多租户或多业务线的场景。
  • 数据存储核心:Collection
  1. Collection 是核心数据单元,所有插入、查询、删除等操作围绕它展开。
  • 它的结构由 Schema 决定,数据被存储在多个 Partitions 和 Segments 中。
  1. 数据逻辑与物理组织:Partition 和 Segment
  • Partition 是数据的逻辑分组。
  • Segment 是数据的物理存储块,是索引和查询的直接操作对象。
  1. 查询加速工具:Index
  • 为 Segment 的向量字段创建索引,加速大规模向量相似性搜索。
  1. 多功能数据检索:Query/Search
  • 检索结合了向量字段的相似性搜索和标量字段的过滤。
  1. 历史数据支持:Time Travel
  • 依赖 Segment 快照,支持历史版本的数据查询。