Einfügen von Entitäten

In diesem Abschnitt wird beschrieben, wie Daten von der Clientseite aus in Milvus eingefügt werden.

Alternativ kann auch MilvusDM verwendet werden, um Daten nach Milvus zu migrieren. MilvusDM ist ein Open-Source-Tool, das speziell für den Import und Export von Daten mit Milvus entwickelt wurde.

Milvus 2.1 unterstützt den Datentyp VARCHAR für skalare Felder. Wenn ein Index für ein skalares Feld vom Typ VARCHAR erstellt wird, ist der Standardindextyp ein Trie.

Im folgenden Beispiel werden 2.000 Zeilen zufällig generierter Daten als Beispieldaten eingefügt (das Milvus CLI-Beispiel verwendet eine vorab erstellte remote CSV-Datei mit ähnlichen Daten). In realen Anwendungen können höherdimensionale Vektoren als im Beispiel verwendet werden. Du kannst deine eigenen Daten vorbereiten, um das Beispiel zu ersetzen.

Datenvorbereitung

Zuerst muss die einzufügende Daten vorbereitet werden. Der Datentyp der einzufügenden Daten muss mit dem Schema der Sammlung übereinstimmen, sonst wirft Milvus eine Ausnahme.

Milvus unterstützt Standardwerte für skalare Felder, mit Ausnahme der Primärschlüsselfelder. Das bedeutet, dass während des Einfügens oder Aktualisierens von Daten bestimmte Felder leer gelassen werden können. Weitere Informationen findest du unter Erstellen einer Sammlung.

Nachdem das dynamische Schema aktiviert wurde, können dynamische Felder zu den Daten hinzugefügt werden. Weitere Informationen findest du unter Dynamisches Schema.

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)

Daten in Milvus einfügen

Die Daten in eine Sammlung einfügen.

Durch Angabe des partition_name kannst du auswählen, in welche Partition die Daten eingefügt werden sollen.

_, err = milvusClient.Insert(
	context.Background(), // ctx
	"book",               // CollectionName
	"",                   // partitionName
	idColumn,             // columnarData
	wordColumn,           // columnarData
	introColumn,          // columnarData
)
if err != nil {
	log.Fatal("Fehler beim Einfügen der Daten:", err.Error())
}
Parameter Beschreibung
ctx Kontext, der zur Steuerung des API-Aufrufprozesses verwendet wird.
CollectionName Name der Sammlung, in die die Daten eingefügt werden sollen.
partitionName Name der Partition, in die die Daten eingefügt werden sollen. Wenn leer gelassen, werden die Daten in die Standardpartition eingefügt.
columnarData Daten, die in jedes Feld eingefügt werden sollen.

Nach dem Einfügen von Entitäten in eine bereits indizierte Sammlung ist es nicht erforderlich, die Sammlung neu zu indizieren, da Milvus automatisch einen Index für die neu eingefügten Daten erstellt.

Aktualisieren von Daten

Nachdem Daten in Milvus eingefügt wurden, werden sie in Segmente eingefügt. Segmente müssen eine bestimmte Größe erreichen, um versiegelt und indiziert zu werden. Nicht versiegelte Segmente werden durch Brute-Force-Suche abgefragt. Um diese Situation zu vermeiden, ist es am besten, flush() aufzurufen. Die flush()-Methode versiegelt alle verbleibenden Segmente und sendet sie zum Index. Es ist sehr wichtig, diese Methode nur zu Ende der Einfügesitzung aufzurufen. Ein zu häufiger Aufruf dieser Methode kann zu fragmentierten Daten führen, die später bereinigt werden müssen.

Einschränkungen

Funktion Maximale Grenze
Vektordimension 32.768

Daten vorbereiten

Zuerst bereiten Sie die zu aktualisierenden Daten vor. Der Datentyp, der aktualisiert werden soll, muss dem Schema der Sammlung entsprechen, da Milvus andernfalls eine Ausnahme auslöst.

Milvus unterstützt Standardwerte für skalare Felder, mit Ausnahme von Primärschlüsselfeldern. Dies bedeutet, dass während des Daten-Einfüge- oder Aktualisierungsvorgangs bestimmte Felder leer bleiben können. Weitere Informationen finden Sie in der Erstellung der Sammlung.

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("zufällig", randomList)
embeddingColData := entity.NewColumnFloatVector("Einbettungen", dim, embeddingList)

Daten aktualisieren

Aktualisieren Sie die Daten in der Sammlung.

if _, err := c.Upsert(ctx, collectionName, "", idColData, embeddingColData);
err != nil {
    log.Fatalf("Fehler beim Aktualisieren der Daten, err: %v", err)
}