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 | 是否将字段设为主键字段 | 数据类型:布尔 ( 或 ):布尔型 (true 或false )。主键字段必须设置* |
auto_id (主键字段必须) | 启用或禁用自动 ID(主键)分配的开关。 | True 或 False |
max_length (对 VARCHAR 字段必填) | 允许插入字符串的最大字节长度。请注意,多字节字符(如 Unicode 字符)可能占用一个以上的字节,因此请确保插入字符串的字节长度不超过指定的限制。 | [1, 65,535] (提醒:如果搭配使用embedding模型,也需要考虑模型支持的max length) |
dim | 向量的维数 | 数据类型:整数∈[1, 32768]。 稠密向量场必须使用。稀疏向量场省略。(提醒:如果搭配使用embedding模型,需和模型生成的向量维度保持一致) |
is_partition_key | 该字段是否为 Partition Key 字段。 | 数据类型:布尔类型 (true 或false )。 |
支持的数据类型
主键字段支持
Data Type | |
---|---|
INT64 | numpy.int64 |
varchar | varchar |
标量字段支持
Data Type | Python Equivalent |
---|---|
BOOL | bool (True or False) |
INT8 | numpy.int8 |
INT16 | numpy.int16 |
INT32 | numpy.int32 |
INT64 | numpy.int64 |
FLOAT | numpy.float32 |
DOUBLE | numpy.double |
varchar | varchar |
JSON | |
Array | 数组 |
向量字段支持
数据类型 | 描述 |
---|---|
BINARY_VECTOR | 将二进制数据存储为 0 和 1 的序列,用于图像处理和信息检索中的紧凑特征表示。 |
FLOAT_VECTOR | 存储 32 位浮点数,常用于科学计算和机器学习中的实数表示。 |
FLOAT16_VECTOR | 存储 16 位半精度浮点数,用于深度学习和 GPU 计算,以提高内存和带宽效率。 |
BFLOAT16_VECTOR | 存储精度降低但指数范围与 Float32 相同的 16 位浮点数,常用于深度学习,可在不明显影响精度的情况下降低内存和计算要求。 |
SPARSE_FLOAT_VECTOR | 存储非零元素及其相应索引的列表,用于表示稀疏向量。更多信息,请参阅稀疏向量。 |
Collections 模式
字段模式是对字段的逻辑定义,那么集合模式便是对一个集合的逻辑定义,即定义一个集合应该包含哪些字段和一起其他基础信息。
集合模式有以下属性:
属性 | 说明 | 说明 |
---|---|---|
field | 要创建的 Collection 中的字段 | 必填 |
description | Collection 的描述 | 数据类型: 可选 |
partition_key_field | 用作 Partition Key 的字段名称 | 数据类型: 字符串: 可选 |
enable_dynamic_field | 是否启用动态 Schema | 数据类型:布尔型 (true 或false )。可选,默认为 False 。有关动态模式的详细信息,请参阅动态模式和管理 Collections 的用户指南。 |
代码示例
假设我们需要创建一个名为 hybrid_demo
的collection用于混合检索,且这个集合包含四个字段,一个是主键,一个是检索文本,一个是检索文本的稠密向量表示,还有一个是检索文本的稀疏向量表示。
1 .首先,我们导入需要用到的相关类;
from pymilvus import (
utility,
FieldSchema, CollectionSchema, DataType,
Collection, AnnSearchRequest, RRFRanker, connections, WeightedRanker
)
- 连接到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")
- 定义所需要的四个字段;
# 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)
- 基于创建的字段模式创建集合模式;
fields = [id_field, text_field, sparse_vector_field, dense_vector_field]
schema = CollectionSchema(fields, "")
- 指定集合名词和集合模式创建集合;
col_name = 'hybrid_demo'
# Now we can create the new collection with above name and schema.
col = Collection(col_name, schema, consistency_level="Strong")
- 打印查看集合信息;
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}
- 将实体数据插入集合;
entities = [docs, docs_embeddings["sparse"], docs_embeddings["dense"]]
col.insert(entities)
# Flush the data
col.flush()
以下来自 ChatGPT 引导解释:
flush()
函数的作用是将当前集合中的所有实体“封存”(seal),即将它们写入持久存储。执行 flush()
后,再插入的新实体会生成新的段(segment)。只有封存的段才能进行索引操作,因此 flush()
在索引和检索场景中至关重要。通过封存数据,确保在后续的检索中可以对数据进行有效的索引和查询操作。
简单来说,flush()
将数据固化,以便后续创建索引和优化查询性能。
- 检查集合里面实体数量。
print(col.num_entities)
下一篇博客介绍如何基于新创建的collection进行index的创建并实现检索。