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

Milvus python库 pymilvus 常用操作详解之Collection(上)

Milvus安装部署方式:docker compose

使用方式:通过python环境中安装 pymilvus 第三方库并调用相关方法实现

在正式讲解代码之前,我们先了解一下Milvus向量数据库中涉及到的一个重要概念,Collection集合。

Collection 集合

可参考 官方文档解释

Milvus中的Collections 和插入某个collection中的实体好比于关系数据库中的表和记录,也就是说Collection是一个具有固定的列和变化行的二维表。每列代表一个字段,每行代表一个实体。

类似于关系型数据库,Collections中也可以通过指定向量字段的数据类型和维度进行约束。通过创建字段并定义其顺序,可以形成一个 Collections Schema,即字段模式。

字段模式

字段模式是字段的逻辑定义。在定义集合模式和管理集合之前,首先需要定义它。

注意,Milvus 只支持在一个 Collection 中使用一个主键字段。

属性解释说明
name要创建的 Collection 中字段的名称数据类型:
必填*
dtype字段的数据类型必须填写*,支持的数据类型可以参考官方文档
description字段描述数据类型: 字符串(可选)
is_primary是否将字段设为主键字段数据类型:布尔 ( 或 ):布尔型 (truefalse)。
主键字段必须设置*
auto_id (主键字段必须)启用或禁用自动 ID(主键)分配的开关。TrueFalse
max_length (对 VARCHAR 字段必填)允许插入字符串的最大字节长度。请注意,多字节字符(如 Unicode 字符)可能占用一个以上的字节,因此请确保插入字符串的字节长度不超过指定的限制。[1, 65,535] (提醒:如果搭配使用embedding模型,也需要考虑模型支持的max length)
dim向量的维数数据类型:整数∈[1, 32768]。 稠密向量场必须使用。稀疏向量场省略。(提醒:如果搭配使用embedding模型,需和模型生成的向量维度保持一致)
is_partition_key该字段是否为 Partition Key 字段。数据类型:布尔类型 (truefalse)。
支持的数据类型

主键字段支持

Data Type
INT64numpy.int64
varcharvarchar

标量字段支持

Data TypePython Equivalent
BOOLbool (True or False)
INT8numpy.int8
INT16numpy.int16
INT32numpy.int32
INT64numpy.int64
FLOATnumpy.float32
DOUBLEnumpy.double
varcharvarchar
JSON
Array数组

向量字段支持

数据类型描述
BINARY_VECTOR将二进制数据存储为 0 和 1 的序列,用于图像处理和信息检索中的紧凑特征表示。
FLOAT_VECTOR存储 32 位浮点数,常用于科学计算和机器学习中的实数表示。
FLOAT16_VECTOR存储 16 位半精度浮点数,用于深度学习和 GPU 计算,以提高内存和带宽效率。
BFLOAT16_VECTOR存储精度降低但指数范围与 Float32 相同的 16 位浮点数,常用于深度学习,可在不明显影响精度的情况下降低内存和计算要求。
SPARSE_FLOAT_VECTOR存储非零元素及其相应索引的列表,用于表示稀疏向量。更多信息,请参阅稀疏向量。
Collections 模式

字段模式是对字段的逻辑定义,那么集合模式便是对一个集合的逻辑定义,即定义一个集合应该包含哪些字段和一起其他基础信息。

集合模式有以下属性:

属性说明说明
field要创建的 Collection 中的字段必填
descriptionCollection 的描述数据类型:
可选
partition_key_field用作 Partition Key 的字段名称数据类型: 字符串:
可选
enable_dynamic_field是否启用动态 Schema数据类型:布尔型 (truefalse)。
可选,默认为False
有关动态模式的详细信息,请参阅动态模式和管理 Collections 的用户指南。

代码示例

假设我们需要创建一个名为 hybrid_demo 的collection用于混合检索,且这个集合包含四个字段,一个是主键,一个是检索文本,一个是检索文本的稠密向量表示,还有一个是检索文本的稀疏向量表示。

1 .首先,我们导入需要用到的相关类;

from pymilvus import (
    utility,
    FieldSchema, CollectionSchema, DataType,
    Collection, AnnSearchRequest, RRFRanker, connections, WeightedRanker
)
  1. 连接到milvus(在这之前请确保 docker compose是属于up的状态);
connections.connect("default", host="localhost", port="19530")

如果想了解目前已有哪些集合存在,可以运行:

# 列出当前所有collection
utility.list_collections()

如果想删除某个集合,调用 drop_collection() 函数并将集合名词作为参数传入:

# 根据collection name drop掉某个collection
utility.drop_collection('hybrid_demo')

如果想load某个已经存在的集合,以集合名词作为参数传入创建一个 Collection 类的对象:

col = Collection("hybrid_demo")
  1. 定义所需要的四个字段;
# Use auto generated id as primary key
id_field = FieldSchema(name="pk", dtype=DataType.VARCHAR,is_primary=True, auto_id=True, max_length=100)
# Store the original text to retrieve based on semantically distance
text_field = FieldSchema(name="text", dtype=DataType.VARCHAR, max_length=512)
# Milvus now supports both sparse and dense vectors, we can store each in
# a separate field to conduct hybrid search on both vectors.\
sparse_vector_field = FieldSchema(name="sparse_vector", dtype=DataType.SPARSE_FLOAT_VECTOR)
dense_vector_field = FieldSchema(name="dense_vector", dtype=DataType.FLOAT_VECTOR, dim=1024)
  1. 基于创建的字段模式创建集合模式;
fields = [id_field, text_field, sparse_vector_field, dense_vector_field]
schema = CollectionSchema(fields, "")
  1. 指定集合名词和集合模式创建集合;
col_name = 'hybrid_demo'
# Now we can create the new collection with above name and schema.
col = Collection(col_name, schema, consistency_level="Strong")
  1. 打印查看集合信息;
print(col)
# 可以看到集合的基本信息
<Collection>:
-------------
<name>: hybrid_demo
<description>: 
<schema>: {'auto_id': True, 'description': '', 'fields': [{'name': 'pk', 'description': '', 'type': <DataType.VARCHAR: 21>, 'params': {'max_length': 100}, 'is_primary': True, 'auto_id': True}, {'name': 'text', 'description': '', 'type': <DataType.VARCHAR: 21>, 'params': {'max_length': 512}}, {'name': 'sparse_vector', 'description': '', 'type': <DataType.SPARSE_FLOAT_VECTOR: 104>}, {'name': 'dense_vector', 'description': '', 'type': <DataType.FLOAT_VECTOR: 101>, 'params': {'dim': 1024}}], 'enable_dynamic_field': False}
  1. 将实体数据插入集合;
entities = [docs, docs_embeddings["sparse"], docs_embeddings["dense"]]
col.insert(entities)
# Flush the data 
col.flush()

以下来自 ChatGPT 引导解释:

flush() 函数的作用是将当前集合中的所有实体“封存”(seal),即将它们写入持久存储。执行 flush() 后,再插入的新实体会生成新的段(segment)。只有封存的段才能进行索引操作,因此 flush() 在索引和检索场景中至关重要。通过封存数据,确保在后续的检索中可以对数据进行有效的索引和查询操作。

简单来说,flush() 将数据固化,以便后续创建索引和优化查询性能。

  1. 检查集合里面实体数量。
print(col.num_entities)

下一篇博客介绍如何基于新创建的collection进行index的创建并实现检索。


http://www.kler.cn/a/420764.html

相关文章:

  • 基于Java Springboot宠物咖微信小程序
  • 【PyTorch】回归问题代码实战
  • k8s 资源管理resourceQuota
  • 夜神模拟器+Charles+postern+Mgisk+TrustMeAlready实现抓包
  • 云服务器和物理服务器租用哪个好?
  • 纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
  • 算力100问☞第32问:密集计算的关键技术有哪些?
  • Pytest --capture 参数详解:如何控制测试执行过程中的输出行为
  • 【ONE·基础算法 || 动态规划(三)】
  • 基于Java Springboot成人教育APP且微信小程序
  • Web实时通信@microsoft/signalr
  • C语言第十四周课——课堂练习
  • pip更换国内源,加速Python包下载(附2024年12月最新国内镜像源列表)
  • Unity3D 设置图片拉伸四角不变形
  • PhPMyadmin-漏洞复现
  • 工业公辅车间数智化节能头部企业,蘑菇物联选择 TDengine 升级 AI 云智控
  • [在线实验]-RabbitMQ镜像的下载与部署
  • android 阻止返回退出
  • 【笔记总结】华为云:应用上云后的安全规划及设计
  • form表单阻止默认事件及获取值
  • PH热榜 | 2024-12-02
  • Milvus Cloud 2.5:向量数据库的新里程碑与全文检索的革新
  • 大数据治理:解锁数据价值,引领未来创新
  • windows C#-测试引用相等性
  • 人机交互中的状态交互、趋势交互
  • vue 3中使用复制功能