一架梯子,一头程序猿,仰望星空!
Milvus向量数据库教程 > 内容正文

Python Milvus数据CRUD


插入实体

本节介绍了如何通过客户端向 Milvus 插入数据。

您还可以使用 MilvusDM 将数据迁移到 Milvus,MilvusDM 是专门用于导入和导出 Milvus 数据的开源工具。

Milvus 2.1 在标量字段上支持 VARCHAR 数据类型。在为 VARCHAR 类型的标量字段构建索引时,默认索引类型为字典树。

以下示例将2,000行随机生成的数据插入为示例数据(Milvus CLI 示例使用预构建的远程 CSV 文件,其中包含类似的数据)。实际应用程序往往会使用比示例更高维度的向量。您可以准备自己的数据来替换示例数据。

准备数据

首先,准备要插入的数据。要插入的数据类型必须与集合的模式匹配,否则 Milvus 将会引发异常。

Milvus 支持标量字段的默认值,主键字段除外。这表示在数据插入或更新期间,某些字段可以留空。有关更多信息,请参阅创建集合。

启用动态模式后,您可以将动态字段追加到数据中。有关详细信息,请参阅动态模式。

import random
data = [
  [i for i in range(2000)],
  [str(i) for i in range(2000)],
  [i for i in range(10000, 12000)],
  [[random.random() for _ in range(2)] for _ in range(2000)],
  [], 
  None,
]

data.append([str("dy"*i) for i in range(2000)])

将数据插入Milvus

将数据插入集合中。

通过指定 partition_name,您可以选择将数据插入到哪个分区中。

from pymilvus import Collection
collection = Collection("book")      # 获取现有的集合。
mr = collection.insert(data)
参数 描述
data 要插入到 Milvus 中的数据。
partition_name(可选) 要插入数据的分区的名称。

将实体插入到先前已索引的集合中后,无需重新索引集合,因为 Milvus 将自动为新插入的数据创建索引。有关更多信息,请参阅在插入矢量后是否可以创建索引?

刷新Milvus中的数据

当数据插入到 Milvus 中时,会插入到段中。段必须达到一定的大小才能被封存和索引。未封存的段将使用暴力搜索。为了避免这种情况,对于任何剩余数据,最好调用 flush()flush()调用将封存任何剩余的段并将其发送到索引。只在插入会话结束时调用此方法非常重要。调用次数太频繁会导致碎片化的数据,需要稍后进行清理。

限制

功能 最大限制
矢量的维度 32,768

Upsert 更新实体

Upsert 更新是插入和删除操作的组合。在 Milvus 矢量数据库的上下文中,更新是一个数据级操作,如果指定字段已存在于集合中,则会覆盖现有实体,并且如果指定的值不存在,则会插入新实体。

以下示例将3,000行随机生成的数据作为示例数据进行更新。在执行更新操作时,需要注意该操作可能会影响性能。这是因为该操作在执行过程中涉及删除数据。

准备数据

首先,准备要更新的数据。要更新的数据类型必须与集合的模式匹配,否则 Milvus 将会引发异常。

Milvus 支持标量字段的默认值,主键字段除外。这表示在数据插入或更新期间,某些字段可以留空。有关更多信息,请参阅创建集合。

import random
nb = 3000
dim = 8
vectors = [[random.random() for _ in range(dim)] for _ in range(nb)]
data = [
    [i for i in range(nb)],
    [str(i) for i in range(nb)],
    [i for i in range(10000, 10000+nb)],
    vectors,
    [str("dy"*i) for i in range(nb)]
]

更新数据

将数据更新到集合中。

from pymilvus import Collection
collection = Collection("book")  # 获取现有的集合。
mr = collection.upsert(data)

删除实体

Milvus支持使用布尔表达式通过主键进行实体的删除。

准备布尔表达式

准备布尔表达式来过滤需要删除的实体。

Milvus仅支持删除具有明确指定的主键的实体,这可以通过使用”in”运算符来实现。其他运算符只能在查询或向量搜索的标量过滤中使用。

以下示例通过主键值为0和1来过滤数据。

expr = "book_id in [0,1]"

类似SQL的where条件语句

删除实体

使用您创建的布尔表达式删除实体。Milvus将返回已删除实体的ID列表。

from pymilvus import Collection
collection = Collection("book")      # 获取现有的集合。
collection.delete(expr)

压缩数据

Milvus默认支持自动数据压缩。您可以配置Milvus以启用或禁用压缩和自动压缩。

如果禁用了自动压缩,您仍然可以手动进行数据压缩。

手动压缩数据

由于压缩通常耗时较长,因此压缩请求是异步处理的。

from pymilvus import Collection
collection = Collection("book")      # 获取现有的集合。
collection.compact()

检查压缩状态

您可以使用手动压缩触发时返回的压缩ID来检查压缩状态。

collection.get_compaction_state()


关联主题