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] * 128,  # 128维向量(实际由 Embedding 模型生成)
    "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  # 构建时的搜索范围
    }
}

一致性级别(Consistency Level)

一致性级别(Consistency Level)决定了 Milvus 中数据写入后的可见性时机。由于 Milvus 采用日志追加 + 异步构建的存储架构,写入的数据并非立即对查询可见,通过一致性级别可以在"读到的数据有多新"与"查询延迟"之间做权衡。

四个一致性级别

级别名称行为延迟适用场景
Strong强一致读请求会等待所有已写入的日志生效后再返回最高对数据准确性要求严苛的金融、计费场景
Bounded有界一致(默认)数据写入后在一定时间窗口(通常 1-2 秒)后可见平衡大多数在线检索业务,Milvus 默认级别
Eventually最终一致不等待日志生效,尽可能快地返回当前可见数据最低离线分析、对延迟极敏感、容忍短暂时差
Session会话一致同一会话内保证读己所写,跨会话为最终一致较低单用户连续交互的场景

各级别适用场景

  • Strong:写入后必须立即读到(如交易后立即查询余额),代价是搜索延迟升高
  • Bounded:推荐默认选项,兼顾新鲜度与性能,适合绝大多数检索业务
  • Eventually:批量离线召回、监控大屏等对实时性要求不高的场景
  • Session:聊天、推荐等单用户会话内需要"我刚才写入的能立刻被我查到"

创建集合时指定一致性级别

python
from pymilvus import Collection

# 在创建集合时指定一致性级别(默认为 Bounded)
collection = Collection(
    name="article_search",
    schema=schema,
    consistency_level="Bounded"     # 可选: "Strong" / "Bounded" / "Eventually" / "Session"
)

搜索时临时指定一致性级别

python
# 单次搜索覆盖集合的默认一致性级别
results = collection.search(
    data=[query_vector],
    anns_field="embedding",
    param=search_params,
    limit=10,
    consistency_level="Strong"      # 本次搜索要求强一致
)

常见问题排查:很多初学者遇到"插入后立即查询查不到数据"的问题,其根因就是一致性级别。在默认的 Bounded 级别下,数据通常在 1-2 秒后才会对查询可见;若需要插入即可见,可将集合设为 Strong,或在搜索时临时指定 consistency_level="Strong"

相似度度量(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 并进行基本操作。