【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)
posted @ 2026-07-20 20:46  静心笃行。  阅读(19)  评论(0)    收藏  举报