【Milvus合集】1.Milvus 的核心概念(collection、field、index、partition、segment)

一、.Milvus 的核心概念

Milvus 是一款专门为高性能向量检索任务设计的数据库系统。它的核心概念主要包括:


🌟 1. Collection(集合)

类比关系型数据库中的表(Table),一个 Collection 就是一组结构化向量数据的容器。

  • 每个 Collection 都有一套完整的 schema(字段定义)

  • 每个 Collection 通常代表一个向量检索的主题,比如 "商品图像库" 或 "文档向量库"

✅ 示例:

python 复制代码
collection_name = "book_collection"

📌 2. Field(字段)

每个 Collection 由若干个字段构成,字段可以是以下几种类型:

字段类型 说明 示例
Int64 主键字段(必须有一个) book_id = 123
FloatVector 向量字段(必须有一个) [0.23, 0.98, ..., 0.67]
Float, Bool, VarChar 附加属性字段(可选) price = 89.9, title="AI入门"

✅ 示例:

python 复制代码
from pymilvus import FieldSchema, DataType

fields = [
    FieldSchema(name="book_id", dtype=DataType.INT64, is_primary=True, auto_id=False),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=768),
    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=100)
]

🧠 3. Index(索引)

Milvus 为了提升向量检索性能,需要在向量字段上建立 ANN 索引(近似最近邻)。

常见索引类型:

索引类型 场景 特点
FLAT 精确检索 最慢,耗内存
IVF_FLAT 倒排列表 + 精确子搜索 较快,适中
HNSW 小数据量,图搜索结构 快,但内存占用高
DISKANN 海量数据场景 支持磁盘索引,适合大规模

✅ 示例:

python 复制代码
from pymilvus import FieldSchema, DataType

fields = [
    FieldSchema(name="book_id", dtype=DataType.INT64, is_primary=True, auto_id=False),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=768),
    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=100)
]

📂 4. Partition(分区)

一个 Collection 可以按某个字段的取值进行逻辑上的划分,提高查询效率或做数据隔离

  • 常见用途:按用户、时间、类别进行分区

  • 在查询时可以指定分区进行检索,跳过无关数据,加快响应

✅ 示例:

python 复制代码
collection.create_partition("partition_2025")
collection.load(partition_names=["partition_2025"])

🧩 5. Segment(段)

Milvus 内部的数据物理存储单位(你不需要直接操作它)

  • 系统会自动将数据拆分成 Segment,每个 Segment 的大小受限(一般为 512MB)

  • 在查询和删除数据时,Milvus 会按 Segment 级别加载或合并

  • 与"列式存储"系统中的块(Block)类似

📌 通常你只需了解 Segment 的存在,用于理解性能调优或数据刷新机制(compaction)。


🔄 总结类比表

Milvus 概念 类比于传统数据库 用途
Collection Table 存放同类型的向量数据
Field Column 描述每条数据的内容
Index 索引 提高查询速度
Partition 分区 逻辑隔离 / 加速查询
Segment 数据块(隐藏) 系统自动分片管理

二、Partition 与 Index 参数对查询性能的影响

✅ 1. Partition 对性能的影响

Milvus 的 Partition(分区)是对 Collection 逻辑上的划分 ,它能在 查询阶段显著减少检索范围

✨ 性能优势:

  • 过滤加速:查询时如果只检索某个分区,而不是整个 Collection,Milvus 只加载该分区对应的 segment。

  • 内存节省:未使用的分区不会被 load 到内存,节省资源。

  • 隔离性好:分区适合多租户、用户隔离、按时间切片检索等场景。


✅ 2. Index 参数对性能的影响

Index(索引)决定了 Milvus 在做 ANN 检索时的方式,不同索引适用于不同数据量级与精度需求:

索引类型 优点 适用场景 相关参数
FLAT 精确检索,慢 小数据量测试
IVF_FLAT 平衡速度与精度 百万级向量 nlist
HNSW 查询快,适中精度 小型系统 M, efConstruction, ef
DISKANN 支持磁盘索引,节省内存 十亿级数据场景 search_list_size, pq_code_budget_mb, etc

👉 参数意义(以 IVF_FLAT 为例):

  • nlist: 将所有向量划分成多少个簇(越大精度越高,但索引越大)

  • 查询时的 nprobe: 在检索时查询几个簇(越多越精确,但慢)

三、Partition 的详细使用案例

我们以一个图书向量库为例,按图书的语言来划分分区。

📝 场景背景:

你有一本书的标题向量化数据,字段如下:

  • book_id: Int64

  • embedding: FloatVector(768维)

  • language: VarChar(语言,如 "Chinese", "English", "French")

你想按语言划分 Partition,以提高查询效率。


🧱 Step 1: 定义 Collection 与分区

python 复制代码
from pymilvus import CollectionSchema, FieldSchema, DataType, Collection, connections

connections.connect()

# 定义字段
fields = [
    FieldSchema(name="book_id", dtype=DataType.INT64, is_primary=True, auto_id=False),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=768),
    FieldSchema(name="language", dtype=DataType.VARCHAR, max_length=20)
]

schema = CollectionSchema(fields=fields, description="Book vector database")

collection = Collection(name="book_collection", schema=schema)

# 创建分区
collection.create_partition("chinese_books")
collection.create_partition("english_books")

🧪 Step 2: 插入数据到对应分区

python 复制代码
# 插入中文图书数据
collection.insert([
    [1, 2],   # book_id
    [[...], [...]],  # embedding 向量
    ["Chinese", "Chinese"]  # language
], partition_name="chinese_books")

# 插入英文图书数据
collection.insert([
    [3], [[...]], ["English"]
], partition_name="english_books")

🔍 Step 3: 查询时指定分区,提高效率

python 复制代码
collection.load(partition_names=["english_books"])  # 只加载英文书分区

search_params = {
    "metric_type": "L2",
    "params": {"nprobe": 10}
}

results = collection.search(
    data=[[...]],  # 查询向量
    anns_field="embedding",
    param=search_params,
    limit=5,
    output_fields=["book_id", "language"],
    partition_names=["english_books"]  # 👈 仅检索该分区
)

📌 性能提升点

  • 只加载一个分区的 segment,加载更快,占用内存少;

  • 查询范围缩小,ANN 检索速度显著加快;

  • 数据隔离,避免误检。

相关推荐
jonyleek1 小时前
如何搭建一套安全的,企业级本地AI专属知识库系统?从安装系统到构建知识体系,全流程!
人工智能·安全
MQ_SOFTWARE2 小时前
AI驱动的金融推理:Fin-R1模型如何重塑行业决策逻辑
人工智能·金融
生医转码,四海为家2 小时前
零基础-动手学深度学习-6.6 卷积神经网络(LeNet)
人工智能·深度学习·cnn
无名工程师2 小时前
AI 学习过程中各阶段的学习重点、时间规划以及不同方向的选择与建议等内容
人工智能·学习
WXX_s3 小时前
【OpenCV篇】OpenCV——03day.图像预处理(2)
人工智能·python·opencv·学习·计算机视觉
有才不一定有德3 小时前
深入剖析 MetaGPT 中的提示词工程:WriteCode 动作的提示词设计
人工智能·aigc·提示词工程
花月mmc3 小时前
CanMV-K230 AI学习笔记系列
人工智能·笔记·学习
s1ckrain4 小时前
【论文阅读】ON THE ROLE OF ATTENTION HEADS IN LARGE LANGUAGE MODEL SAFETY
论文阅读·人工智能·语言模型·大模型安全
Jackilina_Stone4 小时前
【论文|复现】YOLOFuse:面向多模态目标检测的双流融合框架
人工智能·python·目标检测·计算机视觉·融合