Wstawianie encji

Ten rozdział opisuje, jak wstawiać dane do Milvus za pomocą interfejsu po stronie klienta.

Możesz również użyć narzędzia MilvusDM do migracji danych do Milvus. MilvusDM to narzędzie open-source, specjalnie zaprojektowane do importu i eksportu danych Milvus.

Milvus 2.1 obsługuje typ danych VARCHAR w polach skalarnej wartości. Tworząc indeks dla pola skalarnej wartości typu VARCHAR, domyślnym typem indeksu jest trie.

Poniższy przykład wstawia 2000 wierszy losowo wygenerowanych danych jako dane testowe (przykład konsoli Milvus używa wstępnie zbudowanego zdalnego pliku CSV zawierającego podobne dane). W rzeczywistości aplikacje często używają wektorów o wyższej ilości wymiarów niż w tym przykładzie. Możesz przygotować własne dane, aby zastąpić dane testowe.

Przygotowanie danych

Najpierw przygotuj dane do wstawienia. Typ danych do wstawienia musi pasować do schematu kolekcji, w przeciwnym razie Milvus zgłosi wyjątek.

Milvus obsługuje domyślne wartości dla pól skalarnej wartości, z wyjątkiem pól klucza głównego. Oznacza to, że podczas wstawiania danych lub aktualizacji niektóre pola mogą być pozostawione puste. Więcej informacji można znaleźć w sekcji Tworzenie kolekcji.

Po włączeniu schematu dynamicznego, możesz dołączać dynamiczne pola do danych. Więcej informacji znajdziesz w sekcji Schemat dynamiczny.

import random
data = [
  [i for i in range(2000)],
  [str(i) for i in range(2000)],
  [i for i in range(10000, 12000)],
  [[random.random() for _ in range(2)] for _ in range(2000)],
  [], 
  None,
]

data.append([str("dy"*i) for i in range(2000)])

Wstawianie danych do Milvus

Wstaw dane do kolekcji.

Poprzez określenie partition_name możesz wybrać, do której partycji wstawić dane.

from pymilvus import Collection
collection = Collection("book")  # Pobierz istniejącą kolekcję.
mr = collection.insert(data)
Parametr Opis
data Dane do wstawienia do Milvus.
partition_name (opcjonalny) Nazwa partycji, do której dane zostaną wstawione.

Po wstawieniu encji do wcześniej zindeksowanej kolekcji nie ma potrzeby ponownego indeksowania kolekcji, ponieważ Milvus automatycznie tworzy indeksy dla nowo wstawionych danych. Więcej informacji można znaleźć w sekcji Czy indeksy można tworzyć po wstawieniu wektorów?

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ć zabezpieczone i zindeksowane. Nieszyci segmenty będą korzystać z przeszukiwania bruteforce. Aby uniknąć tej sytuacji, najlepiej jest wywołać flush() dla pozostałych danych. Wywołanie flush() zabezpieczy pozostałe segmenty i wyśle je do indeksu. Ważne jest, aby wywoływać tę metodę tylko na końcu sesji wstawiania. Zbyt częste jej wywoływanie może prowadzić do fragmentacji danych, które będą wymagały późniejszego oczyszczenia.

Ograniczenia

Funkcja Maksymalny limit
Wymiar wektora 32,768

Aktualizowanie encji

Aktualizacja poprzez wstawienie (ang. upsert) to połączenie operacji wstawiania i usuwania. W kontekście bazy danych wektorowej Milvus, aktualizacja to operacja na poziomie danych. Nadpisuje istniejącą encję, jeśli określone pole istnieje w kolekcji, i wstawia nową encję, jeśli określona wartość nie istnieje.

Poniższy przykład aktualizuje 3000 wierszy losowo wygenerowanych danych jako dane testowe. Podczas wykonywania operacji aktualizacji ważne jest zauważenie, że ta operacja może wpłynąć na wydajność, ponieważ obejmuje usuwanie danych.

Przygotowanie danych

Najpierw przygotuj dane do aktualizacji. Typ danych do aktualizacji musi pasować do schematu kolekcji, w przeciwnym razie Milvus zgłosi wyjątek.

Milvus obsługuje domyślne wartości dla pól skalarnej wartości, z wyjątkiem pól klucza głównego. Oznacza to, że podczas wstawiania danych lub aktualizacji niektóre pola mogą być pozostawione puste. Więcej informacji można znaleźć w sekcji Tworzenie kolekcji.

import random
nb = 3000
dim = 8
vectors = [[random.random() for _ in range(dim)] for _ in range(nb)]
data = [
    [i for i in range(nb)],
    [str(i) for i in range(nb)],
    [i for i in range(10000, 10000+nb)],
    vectors,
    [str("dy"*i) for i in range(nb)]
]

Aktualizowanie danych

Zaktualizuj dane w kolekcji.

from pymilvus import Collection
collection = Collection("book")  # Pobierz istniejącą kolekcję.
mr = collection.upsert(data)

Usuwanie encji

Milvus obsługuje usuwanie encji przy użyciu wyrażeń logicznych za pomocą kluczy głównych.

Przygotuj wyrażenie logiczne

Przygotuj wyrażenie logiczne do filtrowania encji do usunięcia.

Milvus obsługuje jedynie usuwanie encji ze zdefiniowanymi kluczami głównymi, co można osiągnąć za pomocą operatora "in". Inne operatory mogą być używane jedynie w skalarnym filtrowaniu do zapytań lub wyszukiwań wektorowych.

Poniższy przykład filtruje dane za pomocą wartości kluczy głównych równych 0 i 1.

expr = "book_id in [0,1]"

Podobne do instrukcji WHERE w SQL

Usuń encję

Użyj przygotowanego wyrażenia logicznego, aby usunąć encje. Milvus zwróci listę identyfikatorów usuniętych encji.

from pymilvus import Collection
collection = Collection("book")      # Pobierz istniejącą kolekcję.
collection.delete(expr)

Kompresuj dane

Milvus domyślnie obsługuje automatyczne kompresowanie danych. Możesz skonfigurować Milvus, aby włączyć lub wyłączyć kompresję automatyczną.

Jeżeli kompresja automatyczna jest wyłączona, możesz wciąż ręcznie kompresować dane.

Ręczne kompresowanie danych

Ponieważ kompresja zazwyczaj zajmuje dużo czasu, żądania kompresji są przetwarzane asynchronicznie.

from pymilvus import Collection
collection = Collection("book")      # Pobierz istniejącą kolekcję.
collection.compact()

Sprawdź stan kompresji

Możesz użyć identyfikatora kompresji zwróconego podczas wyzwalania ręcznej kompresji, aby sprawdzić stan kompresji.

collection.get_compaction_state()