【Milvus】数据组织结构
【Milvus】数据组织结构
1. 顶层逻辑层级结构:Database → Collection → Schema → Field
(1)Database(数据库)
Milvus 最顶层业务隔离单元,默认存在 default 数据库,不同库的集合完全隔离。
from pymilvus import connections, utility
# 连接服务
connections.connect(alias="default", host="127.0.0.1", port="19530")
# 创建数据库
utility.create_database(db_name="rag_db")
# 切换数据库
utility.using_database(db_name="rag_db")
# 查询所有数据库
print(utility.list_databases())
create database rag_db;
use rag_db;
show databases;
(2)Collection(集合,等价 MySQL 表)
数据存储载体,绑定一套独立 Schema、索引、分片副本配置;一个集合可包含主键、标量、多向量字段。
from pymilvus import connections, FieldSchema, DataType, Collection, utility
# 1. 建立 Milvus 连接
connections.connect(alias="default", host="127.0.0.1", port="19530")
# 切换目标数据库
utility.using_database("rag_db")
# 2. 定义 Schema 所有字段
fields = [
# 自增主键
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
# 业务标量字段
FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=500),
FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=3000),
FieldSchema(name="score", dtype=DataType.FLOAT),
FieldSchema(name="is_publish", dtype=DataType.BOOL),
# 标准稠密向量字段
FieldSchema(name="dense_vec", dtype=DataType.FLOAT_VECTOR, dim=768),
# 稀疏向量字段
FieldSchema(name="sparse_vec", dtype=DataType.SPARSE_FLOAT_VECTOR)
]
# 3. 实例化 Collection 创建集合
coll = Collection(
name="rag_knowledge",
fields=fields,
shards_num=1, # 分片数量,分布式集群可调大
consistency_level="Bounded" # 一致性级别
)
print(f"集合 {coll.name} 创建成功")
# 辅助常用集合操作
# 判断集合是否存在
if utility.has_collection("rag_knowledge"):
print("集合已存在")
# 获取集合列表
print(utility.list_collections())
# 删除集合(谨慎使用)
# utility.drop_collection("rag_knowledge")
create collection rag_knowledge (
id bigint primary key autoincrement,
title varchar(500),
content varchar(3000),
score float,
is_publish bool,
dense_vec FLOAT VECTOR(768),
sparse_vec SPARSE_FLOAT_VECTOR
);
-- 查看当前库所有集合
show collections;
-- 删除集合
drop collection if exists rag_knowledge;
(3)Schema(集合字段模板)
定义集合全部字段约束,由多个 FieldSchema 组成,分为三类字段:
1. 主键字段:唯一标识每条数据;
2. 标量字段:用于存储元数据, 如 INT32,VARCHAR,BOOL,FLOAT 等,可以对这些字段进行过滤查询;
3. 向量字段:稠密 / 稀疏向量,用于相似度检索。
2. Field字段分类
| 字段类型 | 集合中是否必有 | 数量限制 | 核心标识参数 | 支持数据类型 |
|---|---|---|---|---|
| 主键字段 | ✅ 必有 | 仅允许 1 个 |
is_primary=True | INT64、VARCHAR(需指定长度) |
| 向量字段 | ✅ 必有 | 最多 4 个 | 专门的向量类型 | 各类向量类型 |
| 分区键字段 | ⭕ 可选 |
仅允许 1 个 | is_partition_key=True | INT64、VARCHAR(需指定长度) |
| 普通标量字段 | ⭕ 可选 | 数量无限制 | 专门的非向量类型 | 整数、字符串、浮点、布尔、JSON、数组等 |
(1)主键字段
# 写法1:INT64 自增主键(业务最常用)
primary_id = FieldSchema(
name="doc_id",
dtype=DataType.INT64,
is_primary=True,
auto_id=True
)
# 写法2:VARCHAR 自定义字符串主键(无法自动生成ID,插入必须手动传值)
primary_uuid = FieldSchema(
name="doc_uuid",
dtype=DataType.VARCHAR,
max_length=64,
is_primary=True
)
-- INT64自增主键
doc_id bigint primary key autoincrement,
-- VARCHAR字符串主键
doc_uuid varchar(64) primary key,
(2)向量字段
-
稠密向量字段(必须指定dim维度)
# 创建 FLOAT_VECTOR(fp32标准稠密)
vec_fp32 = FieldSchema(name="dense_vec", dtype=DataType.FLOAT_VECTOR, dim=768)
# 创建 BFLOAT16_VECTOR
vec_bf16 = FieldSchema(name="vec_bf16", dtype=DataType.BFLOAT16_VECTOR, dim=768)
# 创建 FLOAT16_VECTOR
vec_fp16 = FieldSchema(name="vec_fp16", dtype=DataType.FLOAT16_VECTOR, dim=768)
# 创建 INT8_VECTOR 量化整型
vec_int8 = FieldSchema(name="vec_int8", dtype=DataType.INT8_VECTOR, dim=768)
# 创建 BINARY_VECTOR 二进制向量(dim必须是8倍数)
vec_bin = FieldSchema(name="vec_bin", dtype=DataType.BINARY_VECTOR, dim=512)
dense_vec FLOAT VECTOR(768),
vec_bf16 BFLOAT16_VECTOR(768),
vec_fp16 FLOAT16_VECTOR(768),
vec_int8 INT8_VECTOR(768),
vec_bin BINARY_VECTOR(512)
-
稀疏向量字段 SPARSE_FLOAT_VECTOR
无需定义维度,仅存储非零键值对,只能使用稀疏倒排索引
sparse_vec = FieldSchema(name="sparse_vec", dtype=DataType.SPARSE_FLOAT_VECTOR)
sparse_vec SPARSE_FLOAT_VECTOR
(3)分区键字段
自动按字段值分区,实现冷热数据、业务分类隔离,优化过滤查询性能;开启后 Milvus 根据该字段哈希自动分配分区。
# INT64 分区键
part_key_int = FieldSchema(
name="category_id",
dtype=DataType.INT64,
is_partition_key=True
)
# VARCHAR 分区键(例如按业务分类分区)
part_key_str = FieldSchema(
name="biz_type",
dtype=DataType.VARCHAR,
max_length=32,
is_partition_key=True
)
-- INT64分区键
category_id bigint partition key,
-- VARCHAR分区键
biz_type varchar(32) partition key,
(4)标量基础字段(非向量)
| 字段类型 | 用途 | Python SDK 定义示例 | SQL 定义示例 |
|---|---|---|---|
| INT64 | 主键、数字 ID | FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True) |
id bigint primary key autoincrement |
| VARCHAR | 文本、标题 | FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=3000) |
content varchar(3000) |
| FLOAT | 小数分数 | FieldSchema(name="score", dtype=DataType.FLOAT) |
score float |
| BOOL | 布尔标记 | FieldSchema(name="is_valid", dtype=DataType.BOOL) |
is_valid bool |
# 文本
title = FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=500)
# 浮点数字
score = FieldSchema(name="score", dtype=DataType.FLOAT)
# 布尔
is_valid = FieldSchema(name="is_publish", dtype=DataType.BOOL)
# JSON复杂结构
meta_json = FieldSchema(name="meta_info", dtype=DataType.JSON)
# 数组标签
tag_arr = FieldSchema(name="tags", dtype=DataType.ARRAY, element_type=DataType.VARCHAR, max_capacity=10)

浙公网安备 33010602011771号