当前位置: 首页 > news >正文

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

一、.Milvus 的核心概念

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


🌟 1. Collection(集合)

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

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

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

✅ 示例:

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入门"

✅ 示例:

from pymilvus import FieldSchema, DataTypefields = [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海量数据场景支持磁盘索引,适合大规模

✅ 示例:

from pymilvus import FieldSchema, DataTypefields = [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 可以按某个字段的取值进行逻辑上的划分,提高查询效率或做数据隔离

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

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

✅ 示例:

collection.create_partition("partition_2025")
collection.load(partition_names=["partition_2025"])

🧩 5. Segment(段)

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

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

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

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

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


🔄 总结类比表

Milvus 概念类比于传统数据库用途
CollectionTable存放同类型的向量数据
FieldColumn描述每条数据的内容
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 与分区

from pymilvus import CollectionSchema, FieldSchema, DataType, Collection, connectionsconnections.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: 插入数据到对应分区

# 插入中文图书数据
collection.insert([[1, 2],   # book_id[[...], [...]],  # embedding 向量["Chinese", "Chinese"]  # language
], partition_name="chinese_books")# 插入英文图书数据
collection.insert([[3], [[...]], ["English"]
], partition_name="english_books")

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

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

  • 数据隔离,避免误检。

http://www.dtcms.com/a/301663.html

相关文章:

  • 【lucene】向量搜索底层文件关系梳理
  • springboot实现打印每个接口请求的出参和入参
  • SpringBoot配置文件详解
  • jangow-01-1.0.1靶机
  • Java 后端 Cookie Session Token会话跟踪技术
  • Maven之多模块项目管理
  • c# everthing.exe 通信
  • Level MC-9“恶地”
  • 1.qt历史版本安装与多版本开发(解决被拦截问题)
  • 青少年编程能力等级测评试卷及答案 Python编程(三级)
  • 《频率之光:共生之恋》
  • C9300L Stacking堆叠
  • 人形机器人指南(十)决策
  • 快速了解线性回归算法
  • Item16:成对使用new和delete时要采取相同形式
  • Sklearn 机器学习 数值指标 混淆矩阵confusion matrix
  • Java知识体系
  • 初识 docker [上]
  • 【高等数学】第六章 定积分的应用——第三节 定积分在物理学上的应用
  • GO语言 go get 下载 下来的包存放在哪里
  • 线程安全问题的发现与解决
  • 2025 DevOps开源工具全景指南:构建面向未来的智能交付体系
  • 嵌入式软件面试八股文
  • 面试150 数字范围按位与
  • PLLIP核
  • 测试老鸟整理,物流项目系统测试+测试点分析(一)
  • 【笔记】Gibbs自由能全微分公式推导
  • AJAX 原理_第一节_XHR 对象
  • 免安装MySQL启动全解:从解压到远程访问的保姆级教程
  • U盘中毒,文件被隐藏的解决方法