Skip to content

基础概念

Collection(集合)

Collection 是 Milvus 中存储数据的基本单位,类似于关系型数据库中的表。一个 Collection 包含多个 Entity(实体),每个 Entity 由多个 Field(字段)组成。

Collection 的特点

  • Schema 定义: 创建时需要定义字段结构
  • 动态字段: 支持动态添加字段(可选)
  • 分区支持: 可以划分为多个 Partition
  • 索引支持: 可以为向量字段创建索引

Collection 示例

Collection: image_search
├── Field: id (主键)
├── Field: image_vector (向量字段,维度 128)
├── Field: image_url (标量字段)
├── Field: upload_time (标量字段)
└── Field: category (标量字段)

Entity(实体)

Entity 是 Collection 中的一条记录,包含一组字段值。在向量数据库中,一个 Entity 通常代表一个被向量化的对象。

Entity 示例

python
{
    "id": 1,
    "image_vector": [0.1, 0.2, 0.3, ..., 0.128],  # 128维向量
    "image_url": "https://example.com/image1.jpg",
    "upload_time": "2024-01-15 10:30:00",
    "category": "风景"
}

Field(字段)

Field 定义了 Entity 的属性,分为向量字段和标量字段两种类型。

字段类型

向量字段(Vector Field)

用于存储向量数据,是 Milvus 的核心。

属性说明示例
name字段名称"image_vector"
dtype数据类型DataType.FLOAT_VECTOR
dim向量维度128

标量字段(Scalar Field)

用于存储元数据,支持多种数据类型。

数据类型说明适用场景
DataType.INT8/16/32/64整数类型ID、计数
DataType.FLOAT/DOUBLE浮点类型评分、价格
DataType.VARCHAR字符串类型名称、URL
DataType.BOOL布尔类型状态标记
DataType.JSONJSON 类型复杂元数据
DataType.ARRAY数组类型标签列表

主键字段

每个 Collection 必须有一个主键字段,用于唯一标识 Entity。

  • 类型: INT64VARCHAR
  • 约束: 唯一、非空
  • 自增: 可以设置为自动递增

Partition(分区)

Partition 是 Collection 的逻辑分区,用于数据管理和查询优化。

分区的作用

  1. 数据隔离: 将数据按逻辑分组
  2. 查询优化: 只搜索特定分区,减少数据扫描
  3. 生命周期管理: 可以单独删除分区

分区策略

Collection: user_behavior
├── Partition: partition_2024_q1
├── Partition: partition_2024_q2
├── Partition: partition_2024_q3
└── Partition: partition_2024_q4

默认分区

  • 每个 Collection 都有一个默认分区 _default
  • 如果不指定分区,数据将插入到默认分区

Index(索引)

索引用于加速向量搜索,是 Milvus 性能的关键。

索引类型对比

索引类型算法特点适用场景
FLAT暴力搜索精确、慢小规模数据
IVF_FLAT倒排文件平衡中等规模
IVF_SQ8标量量化省空间内存受限
IVF_PQ乘积量化快速大规模数据
HNSW图算法高速高召回率需求
ANNOY树结构平衡静态数据
DISKANN磁盘索引大容量超大规模

索引参数

IVF 系列索引参数

python
{
    "index_type": "IVF_FLAT",
    "params": {
        "nlist": 128  # 聚类中心数
    }
}

HNSW 索引参数

python
{
    "index_type": "HNSW",
    "params": {
        "M": 16,           # 每个节点的最大连接数
        "efConstruction": 200  # 构建时的搜索范围
    }
}

相似度度量(Metric Type)

Milvus 支持多种相似度计算方式。

距离度量类型

度量类型公式适用场景数据归一化
L2 (欧氏距离)$\sqrt{\sum{(a_i - b_i)^2}}$通用不需要
IP (内积)$\sum{a_i \times b_i}$推荐系统需要
COSINE (余弦相似度)$\frac{a \cdot b}{|a| |b|}$文本、图像不需要

选择建议

  • L2: 适用于大多数场景,特别是当向量的绝对大小不重要时
  • IP: 适用于推荐系统,需要计算向量间的相关性
  • COSINE: 适用于文本和图像搜索,关注方向而非大小

数据类型详解

向量数据类型

python
from pymilvus import DataType

# 浮点向量(最常用)
DataType.FLOAT_VECTOR  # 32位浮点数

# 二进制向量
DataType.BINARY_VECTOR  # 用于汉明距离计算

标量数据类型

python
from pymilvus import DataType

# 整数类型
DataType.INT8    # -128 到 127
DataType.INT16   # -32768 到 32767
DataType.INT32   # -2147483648 到 2147483647
DataType.INT64   # 大整数

# 浮点类型
DataType.FLOAT   # 32位浮点
DataType.DOUBLE  # 64位浮点

# 字符串类型
DataType.VARCHAR  # 变长字符串,需指定最大长度

# 其他类型
DataType.BOOL     # 布尔值
DataType.JSON     # JSON 对象
DataType.ARRAY    # 数组

架构关系图

Milvus 实例

├── Collection: product_search
│   ├── Schema
│   │   ├── Field: product_id (INT64, 主键)
│   │   ├── Field: feature_vector (FLOAT_VECTOR, dim=512)
│   │   ├── Field: product_name (VARCHAR)
│   │   ├── Field: price (FLOAT)
│   │   └── Field: category (VARCHAR)
│   │
│   ├── Index: feature_vector_index (HNSW)
│   │
│   ├── Partition: _default
│   │   ├── Entity 1
│   │   ├── Entity 2
│   │   └── ...
│   │
│   ├── Partition: electronics
│   │   ├── Entity 101
│   │   └── ...
│   │
│   └── Partition: clothing
│       ├── Entity 201
│       └── ...

└── Collection: face_recognition
    ├── Schema
    │   ├── Field: person_id (INT64, 主键)
    │   ├── Field: face_vector (FLOAT_VECTOR, dim=128)
    │   └── Field: name (VARCHAR)

    └── Index: face_vector_index (IVF_FLAT)

核心概念总结

概念类比(关系型数据库)核心作用
CollectionTable数据容器
EntityRow数据记录
FieldColumn数据属性
PartitionPartition数据分区
IndexIndex加速查询

理解这些基础概念后,你就可以开始实际操作 Milvus 了。接下来我们将学习如何使用 Python SDK 连接 Milvus 并进行基本操作。