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)
}