Wykonywanie zapytań warunkowych
Ten temat przedstawia, jak wykonywać zapytania warunkowe, podobne do warunków WHERE w SQL.
W przeciwieństwie do wyszukiwania podobieństwa wektorów, zapytania pozyskują wektory na podstawie filtrowania skalarnej używając wyrażeń logicznych. Milvus obsługuje różne typy danych w polach skalarnej i różnorodne wyrażenia logiczne. Wyrażenia logiczne mogą filtrować pola skalarne lub pola klucza głównego i pozyskiwać wszystkie wyniki spełniające warunki filtrowania.
Poniższy przykład demonstruje, jak wykonać zapytanie na zbiorze danych zawierającym 2000 wierszy, w tym identyfikator książki (klucz główny), liczbę słów (pole skalarne) i wprowadzenie do książki (pole wektorowe). Symuluje to wyszukiwanie określonych książek na podstawie ich identyfikatorów.
Ładowanie Kolekcji
W Milvus, wszystkie operacje wyszukiwania i zapytania są wykonywane w pamięci. Przed wykonaniem zapytania, kolekcja musi być załadowana do pamięci.
err := milvusClient.LoadCollection(
context.Background(), // ctx
"book", // CollectionName
false // async
)
if err != nil {
log.Fatal("Failed to load collection:", err.Error())
}
Wykonywanie zapytania
Poniższy przykład filtrowuje wektory na podstawie konkretnych wartości book_id
i zwraca pola book_id
i book_intro
wyników.
Milvus obsługuje ustawianie poziomów spójności dla zapytań. Ten przykład ustawia poziom spójności na Strong
. Można również 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, patrz Spójność.
Można również używać dynamicznych pól w wyrażeniach filtrujących i polach wyjściowych w zapytaniu. Na przykład, patrz wzorzec dynamiczny.
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
queryResult, err := milvusClient.Query(
context.Background(), // ctx
"book", // CollectionName
"", // PartitionName
entity.NewColumnInt64("book_id", []int64{2,4,6,8}), // expr
[]string{"book_id", "book_intro"}, // OutputFields
opt, // queryOptions
)
if err != nil {
log.Fatal("Failed to query the collection:", err.Error())
}
Parametr | Opis | Opcje |
---|---|---|
ctx |
Kontekst używany do kontroli procesu wywoływania API. | N/A |
CollectionName |
Nazwa kolekcji, którą chcemy zapytać. | N/A |
partitionName |
Nazwy partycji do załadowania. Jeśli jest puste, zapytaj wszystkie partycje. | N/A |
expr |
Wyrażenie logiczne użyte do filtrowania atrybutów. | Aby uzyskać więcej informacji, patrz Reguły Wyrażeń Logicznych. |
OutputFields |
Nazwy pól do zwrócenia. | Pola wektorowe nie są obsługiwane w bieżącej wersji. |
opts |
Opcje zapytania przedstawione w postaci entity.SearchQueryOptionFunc . |
- Limit wskazuje liczbę jednostek do zwrócenia. - Offset wskazuje liczbę jednostek do pominięcia podczas procesu wyszukiwania. Suma tego parametru i Limit powinna być mniejsza niż 16384 . - ConsistencyLevel wskazuje poziom spójności do zastosowania podczas procesu wyszukiwania. - Ignore Growing wskazuje, czy ignorować rosnący segment podczas procesu wyszukiwania podobieństwa. Domyślna wartość to False , co oznacza, że wyszukiwanie obejmuje rosnący segment. |
Sprawdź zwrócony wynik.
fmt.Printf("%#v\n", queryResult)
for _, qr := range queryResult {
fmt.Println(qr.IDs)
}
Obliczanie Ilości Jednostek
Podczas wykonywania zapytania, można dołączyć count(*)
do output_fields
, dzięki czemu Milvus może zwrócić ilość jednostek w kolekcji. Jeśli chcesz policzyć ilość jednostek spełniających określone warunki, użyj expr
, aby zdefiniować wyrażenie logiczne.
Ograniczenia
Przy użyciu count(*)
w output_fields
, nie wolno używać parametru limit
.