Appearance
基础概念
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.JSON | JSON 类型 | 复杂元数据 |
DataType.ARRAY | 数组类型 | 标签列表 |
主键字段
每个 Collection 必须有一个主键字段,用于唯一标识 Entity。
- 类型:
INT64或VARCHAR - 约束: 唯一、非空
- 自增: 可以设置为自动递增
Partition(分区)
Partition 是 Collection 的逻辑分区,用于数据管理和查询优化。
分区的作用
- 数据隔离: 将数据按逻辑分组
- 查询优化: 只搜索特定分区,减少数据扫描
- 生命周期管理: 可以单独删除分区
分区策略
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)核心概念总结
| 概念 | 类比(关系型数据库) | 核心作用 |
|---|---|---|
| Collection | Table | 数据容器 |
| Entity | Row | 数据记录 |
| Field | Column | 数据属性 |
| Partition | Partition | 数据分区 |
| Index | Index | 加速查询 |
理解这些基础概念后,你就可以开始实际操作 Milvus 了。接下来我们将学习如何使用 Python SDK 连接 Milvus 并进行基本操作。