欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > Milvus python库 pymilvus 常用操作详解之Collection(上)

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

2025/2/23 10:13:53 来源:https://blog.csdn.net/weixin_41338279/article/details/144185954  浏览:    关键词: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的创建并实现检索。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词