Wyszukiwanie podobieństw wektorowych
Ten temat przedstawia, jak wykonać wyszukiwanie encji w Milvus.
Wyszukiwanie podobieństw wektorowych w Milvus oblicza odległość między wektorem zapytania a wektorami w kolekcji i zwraca najbardziej podobne wyniki. Można również wykonać wyszukiwanie mieszane, określając wyrażenie logiczne do filtrowania pól skalarnych lub pól kluczy głównych.
Poniższy przykład demonstruje, jak wykonać wyszukiwanie podobieństw wektorowych w zbiorze danych składającym się z 2000 wierszy, składających się z identyfikatorów książek (klucz główny), częstotliwości słów (pole skalarnego) i opisów książek (pole wektorowe). Symuluje to scenariusz wyszukiwania określonych książek na podstawie zwektoryzowanych opisów. Milvus zwróci najbardziej podobne wyniki na podstawie zdefiniowanego wektora zapytania i parametrów wyszukiwania.
Załaduj kolekcję
Przed wykonaniem wyszukiwania podobieństw wektorowych Milvus wykonuje wszystkie operacje wyszukiwania i zapytania w pamięci. Proszę załaduj kolekcję do pamięci przed wykonaniem wyszukiwania podobieństw wektorowych.
err := milvusClient.LoadCollection(
context.Background(), // ctx
"book", // CollectionName
false // async
)
if err != nil {
log.Fatal("nie udało się załadować kolekcji:", err.Error())
}
Przygotuj parametry wyszukiwania
Przygotuj parametry odpowiednie dla swojego scenariusza wyszukiwania. W poniższym przykładzie definiujemy użycie odległości euklidesowej do obliczenia odległości i pobierania wektorów z dziesięciu najbliższych klastrów zbudowanych przez indeks IVF_FLAT.
sp, _ := entity.NewIndexIvfFlatSearchParam( // NewIndex*SearchParam func
10, // searchParam
)
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
Parametr | Opis | Opcje |
---|---|---|
NewIndex*SearchParam func |
Funkcja tworząca entity.SearchParam na podstawie różnych typów indeksów. |
Dla wektorów zmiennoprzecinkowych: - NewIndexFlatSearchParam() (FLAT) - NewIndexIvfFlatSearchParam(nprobe int) (IVF_FLAT) - NewIndexIvfSQ8SearchParam(nprobe int) (IVF_SQ8) - NewIndexIvfPQSearchParam(nprobe int) (RNSG) - NewIndexHNSWSearchParam(ef int) (HNSW) Dla wektorów binarnych: - NewIndexBinFlatSearchParam(nprobe int) (BIN_FLAT) - NewIndexBinIvfFlatSearchParam(nprobe int) (BIN_IVF_FLAT) |
sp |
Parametry wyszukiwania specyficzne dla indeksu zwracane przez poprzednią funkcję. | Zobacz Indeks Wektorowy w celu uzyskania szczegółów. |
opt |
Opcje wyszukiwania ANN. | - Limit : Określa liczbę zwracanych encji. - Offset : Określa liczbę pomijanych encji podczas wyszukiwania. Suma tego parametru i Limit powinna być mniejsza niż 16384. Na przykład, jeśli chcesz zapytać o 9. i 10. najbliższych sąsiadów wektora, ustaw Limit na 2 i Offset na 8 . - ConsistencyLevel : Określa poziom spójności stosowany podczas wyszukiwania. - Ignoruj rosnące : Wskazuje, czy ignorować rosnące segmenty w wyszukiwaniu podobieństw. Domyślna wartość to False , co oznacza, że wyszukiwanie obejmuje rosnące segmenty. |
Wykonaj wyszukiwanie wektorowe
Aby wykonać wyszukiwanie wektorowe przy użyciu Milvus, określ listę nazw partycji w celu wyszukiwania w określonej partycji.
Milvus obsługuje ustawianie poziomu spójności wyszukiwania. W tym przykładzie poziom spójności ustawiony jest na Strong
. Możesz także ustawić poziom spójności na Bounded
, Session
lub Eventually
. Aby uzyskać więcej informacji na temat czterech poziomów spójności w Milvus, zobacz Rozdział o Spójności.
wynikWyszukiwania, błąd := milvusClient.Search(
context.Background(), // ctx
"book", // NazwaKolekcji
[]string{}, // ListaNazwPartycji
"", // wyrażenie
[]string{"book_id"}, // PolaWyjściowe
[]entity.Vector{entity.FloatVector([]float32{0.1, 0.2})}, // wektory
"book_intro", // PoleWektora
entity.L2, // TypMetryki
10, // topK
sp, // sp
opt,
)
if błąd != nil {
log.Fatal("Nie udało się wyszukać kolekcji:", błąd.Error())
}
Parametr | Opis | Opcje |
---|---|---|
ctx |
Kontekst używany do kontrolowania procesu wywołania API | Brak |
NazwaKolekcji |
Nazwa kolekcji do załadowania | Brak |
ListaNazwPartycji |
Lista nazw partycji do załadowania. Jeśli pusta, wyszukuje we wszystkich partycjach | Brak |
wyrażenie |
Wyrażenie logiczne służące do filtrowania właściwości | Zobacz zasady dotyczące wyrażeń logicznych dla szczegółowych informacji |
pola_wyjściowe |
Nazwy pól do zwrócenia | Brak |
wektory |
Wektory do wyszukania | Brak |
PoleWektora |
Nazwa pola do wyszukania | Brak |
TypMetryki |
Typ metryki używany do wyszukiwania | Ten parametr musi być taki sam jak typ metryki użyty do zbudowania indeksu |
topK |
Liczba wyników do zwrócenia. Suma tej wartości i offset w opts powinna być mniejsza niż 16384 |
Brak |
sp |
entity.SearchParam specyficzny dla indeksu |
Brak |
Sprawdź wartości kluczy głównych i odległości najbardziej podobnych wektorów.
fmt.Printf("%#v\n", wynikWyszukiwania)
for _, wr := range wynikWyszukiwania {
fmt.Println(wr.IDs)
fmt.Println(wr.Scores)
}
Po zakończeniu wyszukiwania zwolnij załadowaną kolekcję w Milvus, aby zmniejszyć zużycie pamięci.
błąd := milvusClient.ReleaseCollection(
context.Background(), // ctx
"book", // NazwaKolekcji
)
if błąd != nil {
log.Fatal("Nie udało się zwolnić kolekcji:", błąd.Error())
}
Ograniczenia
Funkcja | Maksymalne Ograniczenie |
---|---|
Długość nazwy kolekcji | 255 znaków |
Liczba partycji w kolekcji | 4 096 |
Liczba pól w kolekcji | 256 |
Liczba fragmentów w kolekcji | 256 |
Wymiarowość wektorów | 32 768 |
Top K | 16 384 |
Liczba wektorów wejściowych | 16 384 |
Wykonywanie Wyszukiwania Mieszane
Wyszukiwanie mieszane to w zasadzie wyszukiwanie wektorowe z filtrowaniem atrybutów. Poprzez określenie wyrażenia logicznego do filtrowania pól skalarnych lub pól klucza głównego można ograniczyć wyszukiwanie na podstawie określonych warunków.
Poniższy przykład pokazuje, jak wykonać wyszukiwanie mieszane na podstawie zwykłego wyszukiwania wektorowego. Załóżmy, że chcesz wyszukać określone książki na podstawie zwektoryzowanego wstępu do książki, ale chcesz odbierać tylko książki w określonym zakresie liczby słów. Możesz wtedy filtrować pole word_count
, określając wyrażenie logiczne w parametrach wyszukiwania. Milvus będzie wyszukiwać tylko podobne wektory w jednostkach, które spełniają określone wyrażenie.
sp, _ := entity.NewIndexFlatSearchParam(
10,
)
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
searchResult, err := milvusClient.Search(
context.Background(),
"book",
[]string{},
"word_count <= 11000",
[]string{"book_id"},
[]entity.Vector{entity.FloatVector([]float32{0.1, 0.2})},
"book_intro",
entity.L2,
2,
sp,
opt,
)
if err != nil {
log.Fatal("Nie udało się wyszukać kolekcji:", err.Error())
}
Sprawdź zwrócone wyniki.
fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
fmt.Println(sr.IDs)
fmt.Println(sr.Scores)
}