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.