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

发布于:2024-12-06 ⋅ 阅读:(28) ⋅ 点赞:(0)

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
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 数据类型:布尔型 (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的创建并实现检索。


网站公告

今日签到

点亮在社区的每一天
去签到