Bedingte Abfrage
In diesem Thema wird erläutert, wie bedingte Abfragen durchgeführt werden.
Im Gegensatz zu Ähnlichkeitssuchen auf Vektoren erhalten bedingte Abfragen Vektoren mithilfe von Skalarfiltern durch boolsche Ausdrücke. Milvus unterstützt Abfragen auf Skalarfeldern und verschiedene boolsche Ausdrücke. Boolsche Ausdrücke können verwendet werden, um Skalarfelder oder Primärschlüsselfelder zu filtern und alle Ergebnisse abzurufen, die den Filterbedingungen entsprechen.
Im folgenden Beispiel wird gezeigt, wie man einen Datensatz von 2000 Zeilen Büchern abfragt, einschließlich Buch-ID (Primärschlüssel), Wortanzahl (Skalarfeld) und Bucheinführung (Vektorfeld), um das Szenario der Abfrage eines bestimmten Buchs anhand seiner ID zu simulieren.
Sammlung laden
Bevor eine Abfrage durchgeführt wird, muss die Sammlung in den Speicher geladen werden.
from pymilvus import Collection
collection = Collection("book") # Eine vorhandene Sammlung erhalten.
collection.load()
Abfrage durchführen
Im folgenden Beispiel werden Vektoren basierend auf bestimmten book_id
-Werten gefiltert und die Felder book_id
und book_intro
in den Ergebnissen zurückgegeben.
Milvus unterstützt die Einstellung von Konsistenzstufen für Abfragen. Das Beispiel in diesem Thema setzt die Konsistenzstufe auf Stark
. Sie können die Konsistenzstufe auch auf Begrenzt
, Sitzung
oder Schließlich
setzen. Für weitere Informationen zu den vier Konsistenzstufen in Milvus lesen Sie bitte Konsistenz.
Sie können auch dynamische Felder im Filterausdruck verwenden und Ausgabefelder in der Abfrageanforderung spezifizieren. Beispielsweise siehe Dynamisches Schema.
res = collection.query(
expr = "book_id in [2,4,6,8]",
offset = 0,
limit = 10,
output_fields = ["book_id", "book_intro"],
)
Parameter | Beschreibung |
---|---|
expr |
Boolscher Ausdruck zur Filterung von Eigenschaften. Für weitere Details zu den Regeln für boolsche Ausdrücke siehe Regeln für boolsche Ausdrücke. |
limit |
Anzahl der zurückzugebenden ähnlichsten Ergebnisse. Die Summe dieses Werts und offset sollte weniger als 16384 sein. |
offset |
Anzahl der Ergebnisse, die in der Sammlung übersprungen werden müssen. Nur verfügbar, wenn limit angegeben ist, und die Summe dieses Werts und limit sollte weniger als 16384 sein. Wenn Sie beispielsweise die 9. und 10. nächsten Nachbarn eines Vektors abfragen möchten, setzen Sie limit auf 2 und offset auf 8 . |
output_fields (optional) |
Liste der zurückzugebenden Feldnamen. |
partition_names (optional) |
Liste der zu abfragenden Partitionsnamen. |
consistency_level (optional) |
Konsistenzstufe für die Abfrage. |
Überprüfen Sie die zurückgegebenen Ergebnisse.
sorted_res = sorted(res, key=lambda k: k['book_id'])
sorted_res
Entitäten zählen
Bei der Durchführung einer Abfrage können Sie count(*)
in output_fields
hinzufügen, damit Milvus die Anzahl der Entitäten in der Sammlung zurückgeben kann. Wenn Sie die Anzahl der Entitäten ermitteln möchten, die bestimmte Bedingungen erfüllen, verwenden Sie expr
, um einen booleschen Ausdruck zu definieren.
Alle Entitäten in der Sammlung zählen:
res = collection.query(
expr="",
output_fields = ["count(*)"],
)
print(res)
print(res[0])
Die Anzahl der Entitäten zählen, die bestimmte Filterbedingungen erfüllen:
res = collection.query(
expr="book_id in [2,4,6,8]",
output_fields = ["count(*)"],
)
print(res)
print(res[0])
Einschränkungen
Bei der Verwendung von count(*)
in output_fields
ist die Verwendung des Parameters limit
untersagt.