エンティティの挿入

このトピックでは、クライアント側からMilvusにデータを挿入する方法について説明します。

また、MilvusDMを使用してデータをMilvusに移行することもできます。MilvusDMは、Milvusとデータのインポートおよびエクスポートを専門に設計されたオープンソースツールです。

Milvus 2.1では、スカラーフィールドのデフォルトのインデックスタイプはトライであり、VARCHARデータタイプもサポートされています。

以下の例では、ランダムに生成されたデータのサンプルデータ(Milvus CLIの例では、類似したデータを含む事前に構築されたリモートCSVファイルが使用されます)を2,000行挿入します。実際のアプリケーションでは、この例よりも高次元のベクトルが使用される場合があります。例を置き換えるために独自のデータを準備することができます。

データの準備

まず、挿入するデータを準備します。挿入するデータのデータ型は、コレクションのスキーマと一致している必要があります。そうでない場合、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("データの挿入に失敗しました:", err.Error())
}
パラメータ 説明
ctx API呼び出しプロセスを制御するために使用されるコンテキスト。
CollectionName データを挿入するコレクションの名前。
partitionName データを挿入するパーティションの名前。空白のままにすると、データはデフォルトのパーティションに挿入されます。
columnarData 各フィールドに挿入するデータ。

既にインデックスが作成されたコレクションにエンティティを挿入した後は、新たにインデックスを作成する必要はありません。Milvusは自動的に新しく挿入されたデータに対してインデックスを作成します。

Milvusでのデータの更新

データの準備

まず、更新するデータを準備します。更新するデータのデータ型はコレクションのスキーマと一致している必要があります。そうでない場合、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("データの更新に失敗しました, err: %v", err)
}