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

AI开发-python-milvus向量数据库(2-4 -milvus-集合表)

有了向量数据库,下一步就该在数据库里创建表,向量库里的表叫集合(Collection),对应关系型数据库的表,这跟mongo库一样,下面先把重要知识点梳理一下:

一、核心概念

 
  • 集合(Collection):类似关系型数据库的「表」,是存储向量数据和标量数据的基本单元。
  • Schema(模式):集合的「结构定义」,规定了集合中字段的名称、数据类型、主键、向量维度等核心属性。
  • 索引(Index):为提升向量 / 标量查询效率而创建的特殊数据结构,Milvus 支持多种索引类型适配不同场景。
  • 加载状态(Load State):Milvus 的集合需要加载到内存才能提供查询服务,分为 Loaded(已加载)和 NotLoaded(未加载)两种状态。

二、向量集合的特点(关键知识点) 

  • 主键字段:每个集合必须有且仅有一个主键字段,支持 INT64/VARCHAR 类型,auto_id=False 表示主键需手动赋值(True 则由 Milvus 自动生成);
  • 向量字段:Milvus 核心字段,支持 FLOAT_VECTOR(浮点型)和 BINARY_VECTOR(二进制),dim 必须与插入的向量维度一致(如 512、768 等);
  • 动态字段enable_dynamic_field=True 是 Milvus 的灵活特性,允许插入 Schema 中未定义的字段(如临时新增的标签、权重等),适合数据结构不固定的场景。

三、索引

  • 标量索引:主键 / 字符串等标量字段常用 STL_SORT(排序索引),适合等值、范围查询;
  • 向量索引metric_type(度量类型):COSINE(余弦相似度)适合文本向量,L2(欧氏距离)适合图片向量,需根据业务场景选择。

四、加载和分片

  • 加载状态:创建集合时传入 index_params 会自动加载集合到内存(Loaded),无索引则需后续手动调用 client.load_collection() 加载;
  • 分片(Shard)num_shards 用于将集合数据拆分到多个分片,提升并发写入 / 查询性能,分片数需根据数据量和集群节点数调整(单节点集群建议设为 1)。

下面看代码:

# 过滤 pymilvus 依赖的 pkg_resources 废弃警告(setuptools≥81 版本触发)
# 目的是消除版本兼容带来的无关警告,让控制台输出更整洁
import warnings
warnings.filterwarnings("ignore", message=".*pkg_resources is deprecated as an API.*")# 导入 Milvus 客户端核心模块和数据类型枚举
from pymilvus import MilvusClient, DataType# -------------------------- 核心操作:Milvus 集合(Collection)创建 --------------------------
# 1. 初始化 Milvus 客户端连接
# uri: Milvus 服务的地址和端口(HTTP 协议)
# token: 认证令牌,格式为 "用户名:密码"(默认管理员账号 root,密码 Milvus)
client = MilvusClient(uri="http://192.168.211.128:19530",token="root:Milvus"
)# 2. 创建集合模式(Schema)
# schema 是集合的结构定义,包含字段名、数据类型、主键、向量维度等核心信息
# auto_id=False: 禁用自动生成 ID,需手动指定主键值
# enable_dynamic_field=True: 启用动态字段,允许插入 schema 中未定义的字段
schema = MilvusClient.create_schema(auto_id=False,enable_dynamic_field=True,
)# 3. 向 schema 中添加具体字段
# 3.1 添加主键字段:my_id,数据类型为 64 位整数,标记为主键
schema.add_field(field_name="my_id", datatype=DataType.INT64, is_primary=True)
# 3.2 添加向量字段:my_vector,数据类型为浮点型向量,维度为 5(需与插入的向量维度一致)
schema.add_field(field_name="my_vector", datatype=DataType.FLOAT_VECTOR, dim=5)
# 3.3 添加字符串字段:my_varchar,数据类型为 VARCHAR,最大长度 512 字符
schema.add_field(field_name="my_varchar", datatype=DataType.VARCHAR, max_length=512)# 4. 配置索引参数(用于提升查询效率)
# 初始化索引参数对象,用于批量添加多个字段的索引配置
index_params = client.prepare_index_params()# 4.1 为主键字段 my_id 添加索引
# index_type="STL_SORT": 针对排序场景的索引类型,适合主键字段
index_params.add_index(field_name="my_id",index_type="STL_SORT"
)# 4.2 为向量字段 my_vector 添加索引
# index_type="AUTOINDEX": Milvus 自动选择最优的向量索引类型(无需手动指定)
# metric_type="COSINE": 向量相似度计算方式为余弦相似度(常用还有 L2、IP 等)
index_params.add_index(field_name="my_vector",index_type="AUTOINDEX",metric_type="COSINE"
)# 5. 创建带索引的集合(创建时自动加载索引)
# collection_name: 集合名称(two_table)
# schema: 已定义的集合结构
# index_params: 已配置的索引参数,创建集合时会同时创建并加载索引
client.create_collection(collection_name="two_table",schema=schema,index_params=index_params
)# 6. 检查集合的加载状态
# 加载状态用于确认集合是否已加载到内存,可用于查询操作
res = client.get_load_state(collection_name="two_table")
print("two_table 加载状态:", res)  # 输出:{'state': 'Loaded'}(创建时加载索引,状态为已加载)print('---------------- 分割线 ----------------')# 7. 创建不带索引的集合
# 仅指定集合名称和 schema,不传入 index_params,创建后集合无索引,也不会自动加载
client.create_collection(collection_name="one_talbe",  # 注:此处笔误应为 one_table,建议修正schema=schema,
)# 检查无索引集合的加载状态
res = client.get_load_state(collection_name="one_talbe")
# 输出:{'state': 'NotLoaded'}(无索引时,集合不会自动加载到内存)
print("one_talbe 加载状态:", res)
# 补充说明:无索引的集合可后续通过 create_index 方法添加索引,再通过 load_collection 加载# 8. 创建指定分片数的集合
# num_shards=1: 设置集合的分片数量为 1(分片用于数据水平拆分,提升并发性能)
# 适用于大规模数据场景,分片数需根据集群节点数和数据量合理设置
client.create_collection(collection_name="three_table",schema=schema,num_shards=1  # 指定分片数量
)

 执行结果:

two_table 加载状态: {'state': <LoadState: Loaded>}
---------------- 分割线 ----------------
one_talbe 加载状态: {'state': <LoadState: NotLoad>}

更多学习资料尽在老虎网盘资源:http://resources.kittytiger.cn/ 老虎网盘资源
http://www.jsqmd.com/news/377450/

相关文章:

  • 【小技巧】压测过程中,直接把日志打到 VictoriaLogs 中
  • springboot基于Java的员工工资管理系统员工考勤(源码+文档+运行视频+讲解视频)
  • 2026高低压开关柜厂家哪家好,箱式变电站、电力变压器、电力工程、变频控制柜品牌推荐 - 深度智识库
  • springboot基于Java的远程就医系统专家预约(源码+文档+运行视频+讲解视频)
  • 2026年8款主流CRM系统深度剖析:适配不同规模企业,精准选型指南 - 毛毛鱼的夏天
  • P1880 学习笔记
  • springboot基于Java的幼儿园管理系统(源码+文档+运行视频+讲解视频)
  • Agilex 5 的LPDDR4 引脚分配在Quartus 25.1.1 Pro版本 Pin Planner里面自动跳变(HPS端LPDDR4的引脚分配直接通过设置qsf文件)
  • springboot基于Java的在线考试系统学习交流(源码+文档+运行视频+讲解视频)
  • 拥抱TypeScript聚焦编辑器核心配置,夯实工程基石
  • 春节档必看哪个电影:当代国安题材《惊蛰无声》推荐理由与口碑答疑(我的选片经验分享) - SFMEDIA
  • springboot基于Java的在线学生作业管理系统(源码+文档+运行视频+讲解视频)
  • 2026中小企业CRM选型攻略:10款产品全链路能力大比拼 - 毛毛鱼的夏天
  • 分期乐购物额度提取指南:教你一步步完成操作! - 团团收购物卡回收
  • LuoguP2218 [HAOI2007] 覆盖问题 题解
  • P1775 学习笔记
  • 大润发购物卡回收技巧分享 - 团团收购物卡回收
  • 【节点】[BakedGI节点]原理解析与实际应用
  • HSC 电路分析(谐振型)
  • 选购自动锁螺丝机有啥技巧,温州宏海机器人自动锁螺丝机咋样? - 工业品牌热点
  • 芯片设计公司用哪款IM最好?(高保密推荐) - 企业数字化观察家
  • A.每日一题——1446. 连续字符
  • 单通道8孔荧光定量PCR仪
  • 回收大润发购物卡,秒到账! - 团团收购物卡回收
  • 2026年入坑程序员请注意:千万别碰这几个即将被计算机行业淘汰的编程语言!Java/python/golang/C/C++/C#/开发/测试运维/后端/码士集团
  • 【计算机基础】-45-RT-Thread-内存管理机制专注于“运行期堆内存”的动态分配与回收,RT-Thread提供了哪些内存管理机制和算法,以及各自的应用场合。
  • SQL Server Management Studio (SSMS) 22.3.0 - 微软数据库管理工具
  • 2.5 采样策略完全指南:温度、top-p、思维链、结构化输出实战
  • 2.3 模型规模与性能的权衡:参数、上下文、算力全攻略
  • 分期乐购物额度怎么提出来?简单三步快速上手! - 团团收购物卡回收