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

Go Milvus数据CRUD


插入实体

本主题描述了如何通过客户端向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)
}


关联主题