Wstawianie Encji
Ten temat opisuje, jak wstawiać dane do Milvus z poziomu klienta.
Można także użyć narzędzia MilvusDM do migracji danych do Milvus. MilvusDM to narzędzie typu open-source, specjalnie zaprojektowane do importu i eksportu danych z Milvus.
Milvus 2.1 obsługuje typ danych VARCHAR
dla pól skalarnych. Podczas tworzenia indeksu dla pola skalarnego typu VARCHAR, domyślnym typem indeksu jest drzewo trie.
Poniższy przykład wstawia 2000 wierszy losowo wygenerowanych danych jako dane próbkowe (w przykładzie Milvus CLI używany jest wcześniej utworzony zdalny plik CSV zawierający podobne dane). Rzeczywiste aplikacje mogą używać wektorów o wyższych wymiarach niż w przykładzie. Możesz przygotować własne dane, aby zastąpić ten przykład.
Przygotowanie Danych
Najpierw przygotuj dane do wstawienia. Typ danych do wstawienia musi pasować do schematu kolekcji, w przeciwnym razie Milvus wygeneruje wyjątek.
Milvus obsługuje domyślne wartości dla pól skalarnych, z wyjątkiem pól klucza głównego. Oznacza to, że podczas wstawiania danych lub aktualizacji, pewne pola można pozostawić puste. Aby uzyskać więcej informacji, zobacz tworzenie kolekcji.
Po włączeniu schematu dynamicznego, można dodać dynamiczne pola do danych. Aby uzyskać więcej informacji, zobacz schemat dynamiczny.
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)
Wstawianie Danych do Milvus
Wstaw dane do kolekcji.
Poprzez określenie partition_name
możesz wybrać, do której partycji wstawić dane.
_, err = milvusClient.Insert(
context.Background(), // ctx
"book", // CollectionName
"", // partitionName
idColumn, // columnarData
wordColumn, // columnarData
introColumn, // columnarData
)
if err != nil {
log.Fatal("nie udało się wstawić danych:", err.Error())
}
Parametr | Opis |
---|---|
ctx |
Kontekst używany do kontrolowania procesu wywołania API. |
CollectionName |
Nazwa kolekcji, do której wstawia się dane. |
partitionName |
Nazwa partycji, do której wstawia się dane. Jeśli zostanie pozostawione puste, dane zostaną wstawione do partycji domyślnej. |
columnarData |
Dane do wstawienia do każdego pola. |
Po wstawieniu encji do kolekcji, która już została zaindeksowana, nie trzeba ponownie indeksować kolekcji, ponieważ Milvus automatycznie utworzy indeks dla nowo wstawionych danych.
Odświeżanie Danych w Milvus
Kiedy dane są wstawiane do Milvus, są one wstawiane do segmentów. Segmenty muszą osiągnąć określony rozmiar, aby zostać zamkniętymi i zaindeksowanymi. Niezamknięte segmenty będą przeszukiwane poprzez brutalne przeszukiwanie. Aby uniknąć tej sytuacji, najlepiej jest wywołać flush()
. Metoda flush()
zamyka wszystkie pozostałe segmenty i wysyła je do indeksu. Bardzo ważne jest, aby wywołać tę metodę tylko po zakończeniu sesji wstawiania. Zbyt częste wywoływanie tej metody może prowadzić do fragmentacji danych, które trzeba będzie później posprzątać.
Ograniczenia
Funkcja | Maksymalne Ograniczenie |
---|---|
Wymiar Wektora | 32,768 |
Aktualizowanie Danych
Przygotowanie danych
Najpierw przygotuj dane do aktualizacji. Typ danych do aktualizacji musi pasować do schematu kolekcji, w przeciwnym razie Milvus wygeneruje wyjątek.
Milvus obsługuje domyślne wartości dla pól skalarne, z wyjątkiem pól klucza głównego. Oznacza to, że podczas procesu wstawiania lub aktualizacji danych pewne pola mogą pozostać puste. Aby uzyskać więcej informacji, proszę odnieść się do tworzenia kolekcji.
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)
Aktualizacja danych
Zaktualizuj dane w kolekcji.
if _, err := c.Upsert(ctx, collectionName, "", idColData, embeddingColData);
err != nil {
log.Fatalf("nie udało się zaktualizować danych, błąd: %v", err)
}