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.