【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 检索速度显著加快;

  • 数据隔离,避免误检。

相关推荐
YFJ_mily12 小时前
【会议征稿】第八届人本计算与数据智能国际会议(HCC 2026)| 广州12月召开,EI/Scopus稳定检索,多届收录无忧
机器学习·人机交互·ei会议·数据智能·rdlink研发家·人本计算·广州会议
江畔柳前堤17 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
阿里云大数据AI技术17 小时前
分链路差异化设计的DSP准实时数仓|钛动科技基于阿里云实时计算 Flink 版 + DLF Paimon + EMR Serverless StarRocks 的实践
人工智能·flink
陕西企来客17 小时前
2026年7月AI智能搜索曝光趋势研判
大数据·人工智能·机器学习·ai智能搜索曝光
阿里云大数据AI技术18 小时前
从算力到智能体,面向 Agentic AI 的基础设施演进
人工智能·agent
hangyuekejiGEO19 小时前
GEO技术服务选型指南
大数据·人工智能·python
阿里云大数据AI技术19 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
维基框架19 小时前
GitHub源码处理提速 一趟扫描反而更慢
人工智能·github
冬奇Lab19 小时前
代码库知识库系列(05):向量检索 vs 知识图谱——加了调用图并没有变更好
人工智能
AKAMAI19 小时前
你的源服务器可能是你做出的最昂贵决定
运维·人工智能·云计算