插入实体
本主题描述了如何通过客户端向Milvus插入数据。
您也可以使用MilvusDM将数据迁移到Milvus,MilvusDM是一个专门用于与Milvus导入和导出数据的开源工具。
Milvus 2.1 支持标量字段上的 VARCHAR
数据类型。在为 VARCHAR 类型的标量字段构建索引时,默认索引类型是字典树。
以下示例插入了2,000行随机生成的数据作为示例数据(Milvus CLI示例使用包含类似数据的预构建的远程CSV文件)。真实的应用程序可能会使用比示例更高维度的向量。您可以准备自己的数据替换示例。
准备数据
首先,准备要插入的数据。要插入的数据的数据类型必须与集合的模式匹配,否则Milvus将引发异常。
Milvus支持标量字段的默认值,排除主键字段。这意味着在数据插入或更新期间可以将某些字段留空。有关详细信息,请参阅创建集合。
启用动态模式后,您可以在数据中添加动态字段。有关详细信息,请参阅动态模式。
bookIDs := make([]int64, 0, 2000)
wordCounts := make([]int64, 0, 2000)
bookIntros := make([][]float32, 0, 2000)
for i := 0; i < 2000; i++ {
bookIDs = append(bookIDs, int64(i))
wordCounts = append(wordCounts, int64(i+10000))
v := make([]float32, 0, 2)
for j := 0; j < 2; j++ {
v = append(v, rand.Float32())
}
bookIntros = append(bookIntros, v)
}
idColumn := entity.NewColumnInt64("book_id", bookIDs)
wordColumn := entity.NewColumnInt64("word_count", wordCounts)
introColumn := entity.NewColumnFloatVector("book_intro", 2, bookIntros)
将数据插入Milvus
将数据插入到集合中。
通过指定 partition_name
,您可以选择将数据插入到哪个分区。
_, err = milvusClient.Insert(
context.Background(), // ctx
"book", // CollectionName
"", // partitionName
idColumn, // columnarData
wordColumn, // columnarData
introColumn, // columnarData
)
if err != nil {
log.Fatal("failed to insert data:", err.Error())
}
参数 | 描述 |
---|---|
ctx |
用于控制API调用过程的上下文。 |
CollectionName |
要插入数据的集合的名称。 |
partitionName |
要插入数据的分区的名称。如果留空,则数据将插入到默认分区中。 |
columnarData |
要插入到每个字段中的数据。 |
在向先前已经建立索引的集合插入实体后,您无需重新为集合建立索引,因为Milvus将自动为新插入的数据创建索引。
刷新Milvus中的数据
当数据插入到Milvus时,它被插入到分段中。分段必须达到一定的大小才能被封存和索引。未封存的分段将通过暴力搜索进行查询。为了避免这种情况,最好调用flush()
。flush()
方法将封存任何剩余的分段并将其发送到索引。只有在插入会话结束时才调用此方法非常重要。过于频繁地调用此方法会导致碎片化的数据,需要稍后进行清理。
限制
特征 | 最大限制 |
---|---|
向量的维度 | 32,768 |
更新数据
准备数据
首先,准备要更新的数据。要更新的数据类型必须与集合的模式匹配,否则Milvus将抛出异常。
Milvus支持标量字段的默认值,但主键字段除外。这表示在数据插入或更新过程中某些字段可以保留为空。有关更多信息,请参阅创建集合。
nEntities:= 3000
dim:= 8
idList:= make([]int64, 0, nEntities)
randomList:= make([]float64, 0, nEntities)
embeddingList := make([][]float32, 0, nEntities)
for i := 0; i < nEntities; i++ {
idList = append(idList, int64(i))
}
for i := 0; i < nEntities; i++ {
randomList = append(randomList, rand.Float64())
}
for i := 0; i < nEntities; i++ {
vec := make([]float32, 0, dim)
for j := 0; j < dim; j++ {
vec = append(vec, rand.Float32())
}
embeddingList = append(embeddingList, vec)
}
idColData := entity.NewColumnInt64("ID", idList)
randomColData := entity.NewColumnDouble("random", randomList)
embeddingColData := entity.NewColumnFloatVector("embeddings", dim, embeddingList)
更新数据
将数据更新到集合中。
if _, err := c.Upsert(ctx, collectionName, "", idColData, embeddingColData);
err != nil {
log.Fatalf("failed to upsert data, err: %v", err)
}