Durchführung von bedingten Abfragen
In diesem Thema wird erläutert, wie bedingte Abfragen ähnlich den SQL WHERE-Bedingungen durchgeführt werden.
Im Gegensatz zur Vektorsimilaritätssuche rufen Abfragen Vektoren basierend auf skalaren Filtern mithilfe von booleschen Ausdrücken ab. Milvus unterstützt verschiedene Datentypen in skalaren Feldern und eine Vielzahl von booleschen Ausdrücken. Boolesche Ausdrücke können skalare Felder oder Primärschlüsselfelder filtern und alle Ergebnisse abrufen, die den Filterbedingungen entsprechen.
Das folgende Beispiel zeigt, wie eine Abfrage auf einem Datensatz mit 2000 Zeilen, einschließlich Buch-ID (Primärschlüssel), Wörteranzahl (skalares Feld) und Bucheinführung (Vektorfeld), ausgeführt wird. Es simuliert die Abfrage bestimmter Bücher basierend auf ihren IDs.
Laden der Sammlung
In Milvus werden alle Such- und Abfrageoperationen im Arbeitsspeicher durchgeführt. Bevor eine Abfrage durchgeführt wird, muss die Sammlung in den Arbeitsspeicher geladen werden.
err := milvusClient.LoadCollection(
context.Background(), // ctx
"book", // CollectionName
false // async
)
if err != nil {
log.Fatal("Fehler beim Laden der Sammlung:", err.Error())
}
Ausführen der Abfrage
Das folgende Beispiel filtert Vektoren basierend auf bestimmten book_id
-Werten und gibt die Felder book_id
und book_intro
der Ergebnisse zurück.
Milvus unterstützt das Festlegen von Konsistenzstufen für Abfragen. In diesem Beispiel wird die Konsistenzstufe auf Strong
gesetzt. Sie können die Konsistenzstufe auch auf Bounded
, Session
oder Eventually
setzen. Weitere Informationen zu den vier Konsistenzstufen in Milvus finden Sie unter Konsistenz.
Sie können auch dynamische Felder in den Filterausdrücken und Ausgabefeldern in der Abfrageanforderung verwenden. Sehen Sie sich beispielsweise das dynamische Muster an.
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("Fehler beim Abfragen der Sammlung:", err.Error())
}
Parameter | Beschreibung | Optionen |
---|---|---|
ctx |
Zur Steuerung des API-Aufrufprozesses verwendeter Kontext. | N/A |
CollectionName |
Name der abzufragenden Sammlung. | N/A |
partitionName |
Namen der zu ladenden Partitionen. Wenn leer, alle Partitionen abfragen. | N/A |
expr |
Zur Filterung von Attributen verwendeter boolescher Ausdruck. | Weitere Informationen finden Sie unter Regeln für boolesche Ausdrücke. |
OutputFields |
Namen der zurückzugebenden Felder. | Vektorfelder werden in der aktuellen Version nicht unterstützt. |
opts |
Abfrageoptionen dargestellt in Form von entity.SearchQueryOptionFunc . |
- Limit gibt die Anzahl der zurückzugebenden Entitäten an. - Offset gibt die Anzahl der bei der Suche zu überspringenden Entitäten an. Die Summe dieses Parameters und Limit sollte kleiner als 16384 sein. - ConsistencyLevel gibt die anzuwendende Konsistenzstufe während des Suchvorgangs an. - Ignore Growing gibt an, ob das Wachstumssegment während des Ähnlichkeitssuchvorgangs ignoriert werden soll. Der Standardwert ist False , was bedeutet, dass die Suche das Wachstumssegment einschließt. |
Überprüfen Sie das zurückgegebene Ergebnis.
fmt.Printf("%#v\n", queryResult)
for _, qr := range queryResult {
fmt.Println(qr.IDs)
}
Berechnung der Entitätsmenge
Beim Ausführen einer Abfrage können Sie count(*)
an output_fields
anhängen, sodass Milvus die Anzahl der Entitäten in der Sammlung zurückgeben kann. Wenn Sie die Anzahl der Entitäten, die bestimmten Bedingungen entsprechen, zählen möchten, verwenden Sie expr
, um einen booleschen Ausdruck zu definieren.
Einschränkungen
Bei der Verwendung von count(*)
in output_fields
ist die Verwendung des limit
-Parameters nicht zulässig.