插入实体
本节介绍了如何通过客户端向 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()