Grundlegende Operatoren
Milvus bietet einen umfangreichen Satz von Basisoperatoren, die Ihnen helfen, Daten effizient zu filtern und abzufragen. Mit diesen Operatoren können Sie Ihre Suchbedingungen auf der Grundlage von skalaren Feldern, numerischen Berechnungen, logischen Bedingungen und mehr verfeinern. Das Verständnis für die Verwendung dieser Operatoren ist entscheidend für die Erstellung präziser Abfragen und die Maximierung der Effizienz Ihrer Suchen.
Vergleichsoperatoren
Vergleichsoperatoren werden verwendet, um Daten auf der Grundlage von Gleichheit, Ungleichheit oder Größe zu filtern. Sie sind auf numerische und Textfelder anwendbar.
Unterstützte Vergleichsoperatoren:
==(Gleich)!=(Nicht gleich)>(Größer als)<(Kleiner als)>=(Größer als oder gleich)<=(Kleiner als oder gleich)
Beispiel 1: Filtern mit Gleich bis (==)
Angenommen, Sie haben ein Feld mit dem Namen status und möchten alle Entitäten finden, bei denen status "aktiv" ist. Sie können den Gleichheitsoperator == verwenden:
filter = 'status == "active"'
Beispiel 2: Filtern mit Not Equal To (!=)
Um Entitäten zu finden, bei denen status nicht "inaktiv" ist:
filter = 'status != "inactive"'
Beispiel 3: Filtern mit Größer als (>)
Wenn Sie alle Entitäten finden wollen, deren age größer als 30 ist:
filter = 'age > 30'
Beispiel 4: Filtern mit "kleiner als
Um Entitäten zu finden, bei denen price kleiner als 100 ist:
filter = 'price < 100'
Beispiel 5: Filtern mit Größer als oder gleich (>=)
Wenn Sie alle Entitäten finden wollen, bei denen rating größer oder gleich 4 ist:
filter = 'rating >= 4'
Beispiel 6: Filtern mit Kleiner als oder gleich
Um Entitäten zu finden, deren discount kleiner oder gleich 10% ist:
filter = 'discount <= 10'
Bereichsoperatoren
Bereichsoperatoren helfen bei der Filterung von Daten auf der Grundlage bestimmter Gruppen oder Bereiche von Werten.
Unterstützte Bereichsoperatoren:
IN: Wird verwendet, um Werte innerhalb eines bestimmten Satzes oder Bereichs zu finden.LIKE: Wird verwendet, um ein Muster abzugleichen (meist für Textfelder). Milvus ermöglicht es Ihnen, einenNGRAMIndex auf VARCHAR- oder JSON-Feldern zu erstellen, um Textabfragen zu beschleunigen. Einzelheiten finden Sie unter NGRAM.
Beispiel 1: Verwendung von IN zum Abgleich mehrerer Werte
Wenn Sie alle Entitäten finden möchten, bei denen color entweder "rot", "grün" oder "blau" ist:
filter = 'color in ["red", "green", "blue"]'
Dies ist nützlich, wenn Sie die Zugehörigkeit zu einer Liste von Werten prüfen wollen.
Beispiel 2: Verwendung von LIKE für Mustervergleiche
Der Operator LIKE wird für den Mustervergleich in Zeichenkettenfeldern verwendet. Er kann Teilzeichenfolgen an verschiedenen Positionen im Text entsprechen: als Präfix, Infix oder Suffix. Der Operator LIKE verwendet das Symbol % als Platzhalter, der mit einer beliebigen Anzahl von Zeichen (einschließlich Null) übereinstimmen kann.
In den meisten Fällen ist der Infix- oder Suffix-Abgleich deutlich langsamer als der Präfix-Abgleich. Verwenden Sie sie mit Vorsicht, wenn die Leistung entscheidend ist.
Präfix-Abgleich (beginnt mit)
Um einen Präfix-Abgleich durchzuführen, bei dem die Zeichenfolge mit einem bestimmten Muster beginnt, können Sie das Muster an den Anfang stellen und % verwenden, um alle nachfolgenden Zeichen abzugleichen. Beispiel: Sie möchten alle Produkte finden, deren name mit "Prod" beginnt:
filter = 'name LIKE "Prod%"'
Dies entspricht allen Produkten, deren Name mit "Prod" beginnt, z. B. "Produkt A", "Produkt B" usw.
Suffix-Übereinstimmung (Endet mit)
Für eine Suffix-Übereinstimmung, bei der die Zeichenfolge mit einem bestimmten Muster endet, setzen Sie das Symbol % an den Anfang des Musters. Beispiel: Sie möchten alle Produkte finden, deren name mit "XYZ" endet:
filter = 'name LIKE "%XYZ"'
Damit werden alle Produkte gefunden, deren Name mit "XYZ" endet, wie z. B. "ProduktXYZ", "MusterXYZ" usw.
Infix-Abgleich (Enthält)
Um eine Infix-Übereinstimmung durchzuführen, bei der das Muster an beliebiger Stelle in der Zeichenfolge erscheinen kann, können Sie das Symbol % sowohl am Anfang als auch am Ende des Musters platzieren. Beispiel: Sie möchten alle Produkte finden, deren name das Wort "Pro" enthält:
filter = 'name LIKE "%Pro%"'
Dies entspricht allen Produkten, deren Name die Teilzeichenkette "Pro" enthält, wie z. B. "Product", "ProLine" oder "SuperPro".
Arithmetische Operatoren
Mit arithmetischen Operatoren können Sie Bedingungen erstellen, die auf Berechnungen mit numerischen Feldern basieren.
Unterstützte arithmetische Operatoren:
+(Addition)-(Subtraktion)*(Multiplikation)/(Division)%(Modulus)**(Potenzierung)
Beispiel 1: Verwendung von Modulus (%)
Finden von Einheiten, bei denen id eine gerade Zahl ist (d.h. durch 2 teilbar):
filter = 'id % 2 == 0'
Beispiel 2: Verwendung der Potenzierung (**)
Um Entitäten zu finden, bei denen price als Potenz von 2 größer als 1000 ist:
filter = 'price ** 2 > 1000'
Logische Operatoren
Logische Operatoren werden verwendet, um mehrere Bedingungen in einem komplexeren Filterausdruck zu kombinieren. Dazu gehören AND, OR und NOT.
Unterstützte logische Operatoren:
AND: Kombiniert mehrere Bedingungen, die alle wahr sein müssen.OR: Kombiniert Bedingungen, von denen mindestens eine wahr sein muss.NOT: Negiert eine Bedingung.
Beispiel 1: AND zum Kombinieren von Bedingungen verwenden
Alle Produkte finden, bei denen price größer als 100 und stock größer als 50 ist:
filter = 'price > 100 AND stock > 50'
Beispiel 2: OR zum Kombinieren von Bedingungen verwenden
Um alle Produkte zu finden, bei denen color entweder "rot" oder "blau" ist:
filter = 'color == "red" OR color == "blue"'
Beispiel 3: Verwendung von NOT zum Ausschließen einer Bedingung
Um alle Produkte zu finden, bei denen color nicht "grün" ist:
filter = 'NOT color == "green"'
IS NULL und IS NOT NULL Operatoren
Die Operatoren IS NULL und IS NOT NULL werden verwendet, um Felder danach zu filtern, ob sie einen Nullwert (fehlende Daten) enthalten.
IS NULL: Identifiziert Entitäten, bei denen ein bestimmtes Feld einen Nullwert enthält, d.h. der Wert ist nicht vorhanden oder undefiniert.IS NOT NULL: Identifiziert Entitäten, bei denen ein bestimmtes Feld einen anderen Wert als Null enthält, d. h. das Feld hat einen gültigen, definierten Wert.
Bei den Operatoren wird nicht zwischen Groß- und Kleinschreibung unterschieden, Sie können also IS NULL oder is null und IS NOT NULL oder is not null verwenden.
Reguläre skalare Felder mit Nullwerten
Milvus erlaubt die Filterung von regulären skalaren Feldern, wie Strings oder Zahlen, mit Nullwerten.
Eine leere Zeichenfolge "" wird nicht als Nullwert für ein VARCHAR Feld behandelt.
Zum Abrufen von Entitäten, bei denen das Feld description null ist:
filter = 'description IS NULL'
Zum Abrufen von Entitäten, bei denen das Feld description nicht null ist:
filter = 'description IS NOT NULL'
Zum Abrufen von Entitäten, bei denen das Feld description nicht null ist und das Feld price größer als 10 ist:
filter = 'description IS NOT NULL AND price > 10'
JSON-Felder mit Nullwerten
Milvus ermöglicht die Filterung von JSON-Feldern, die Nullwerte enthalten. Ein JSON-Feld wird auf die folgenden Arten als Null behandelt:
Das gesamte JSON-Objekt wird explizit auf None (null) gesetzt, zum Beispiel
{"metadata": None}.Das JSON-Feld selbst fehlt vollständig in der Entität.
Wenn einige Elemente innerhalb eines JSON-Objekts null sind (z. B. einzelne Schlüssel), wird das Feld dennoch als nicht-null betrachtet. Zum Beispiel wird \{"metadata": \{"category": None, "price": 99.99}} nicht als Null behandelt, obwohl der Schlüssel category Null ist.
Zur weiteren Veranschaulichung, wie Milvus JSON-Felder mit Nullwerten behandelt, betrachten Sie die folgenden Beispieldaten mit einem JSON-Feld metadata:
data = [
{
"metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},
"pk": 1,
"embedding": [0.12, 0.34, 0.56]
},
{
"metadata": None, # Entire JSON object is null
"pk": 2,
"embedding": [0.56, 0.78, 0.90]
},
{ # JSON field `metadata` is completely missing
"pk": 3,
"embedding": [0.91, 0.18, 0.23]
},
{
"metadata": {"category": None, "price": 99.99, "brand": "BrandA"}, # Individual key value is null
"pk": 4,
"embedding": [0.56, 0.38, 0.21]
}
]
Beispiel 1: Abrufen von Entitäten, deren Metadaten null sind
Um Entitäten zu finden, bei denen das Feld metadata entweder fehlt oder explizit auf Null gesetzt ist:
filter = 'metadata IS NULL'
# Example output:
# data: [
# "{'metadata': None, 'pk': 2}",
# "{'metadata': None, 'pk': 3}"
# ]
Beispiel 2: Abrufen von Entitäten, bei denen die Metadaten nicht null sind
Um Entitäten zu finden, bei denen das Feld metadata nicht null ist:
filter = 'metadata IS NOT NULL'
# Example output:
# data: [
# "{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}",
# "{'metadata': {'category': None, 'price': 99.99, 'brand': 'BrandA'}, 'pk': 4}"
# ]
ARRAY-Felder mit Nullwerten
Milvus erlaubt die Filterung von ARRAY-Feldern, die Nullwerte enthalten. Ein ARRAY-Feld wird auf folgende Weise als null behandelt:
Das gesamte ARRAY-Feld wird explizit auf None (Null) gesetzt, zum Beispiel
"tags": None.Das ARRAY-Feld fehlt vollständig in der Entität.
Ein ARRAY-Feld kann keine partiellen Nullwerte enthalten, da alle Elemente in einem ARRAY-Feld denselben Datentyp haben müssen. Einzelheiten finden Sie unter Array-Feld.
Zur weiteren Veranschaulichung, wie Milvus ARRAY-Felder mit Nullwerten behandelt, betrachten Sie die folgenden Beispieldaten mit einem ARRAY-Feld tags:
data = [
{
"tags": ["pop", "rock", "classic"],
"ratings": [5, 4, 3],
"pk": 1,
"embedding": [0.12, 0.34, 0.56]
},
{
"tags": None, # Entire ARRAY is null
"ratings": [4, 5],
"pk": 2,
"embedding": [0.78, 0.91, 0.23]
},
{ # The tags field is completely missing
"ratings": [9, 5],
"pk": 3,
"embedding": [0.18, 0.11, 0.23]
}
]
Beispiel 1: Abrufen von Entitäten, bei denen tags null ist
Um Entitäten abzurufen, bei denen das Feld tags entweder fehlt oder explizit auf None gesetzt ist:
filter = 'tags IS NULL'
# Example output:
# data: [
# "{'tags': None, 'ratings': [4, 5], 'embedding': [0.78, 0.91, 0.23], 'pk': 2}",
# "{'tags': None, 'ratings': [9, 5], 'embedding': [0.18, 0.11, 0.23], 'pk': 3}"
# ]
Beispiel 2: Abrufen von Entitäten, bei denen tags nicht null ist
Um Entitäten abzurufen, bei denen das Feld tags nicht null ist:
filter = 'tags IS NOT NULL'
# Example output:
# data: [
# "{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}",
# "{'metadata': {'category': None, 'price': 99.99, 'brand': 'BrandA'}, 'pk': 4}"
# ]
Tipps zur Verwendung grundlegender Operatoren mit JSON- und ARRAY-Feldern
Während die Basisoperatoren in Milvus vielseitig sind und auf skalare Felder angewendet werden können, können sie auch effektiv mit den Schlüsseln und Indizes in den JSON- und ARRAY-Feldern verwendet werden.
Wenn Sie zum Beispiel ein Feld product haben, das mehrere Schlüssel wie price, model und tags enthält, verweisen Sie immer direkt auf den Schlüssel:
filter = 'product["price"] > 1000'
Um Datensätze zu finden, bei denen die erste Temperatur in einem Array von aufgezeichneten Temperaturen einen bestimmten Wert überschreitet, verwenden Sie:
filter = 'history_temperatures[0] > 30'
Schlussfolgerung
Milvus bietet eine Reihe von grundlegenden Operatoren, die Ihnen Flexibilität beim Filtern und Abfragen Ihrer Daten bieten. Durch die Kombination von Vergleichs-, Bereichs-, arithmetischen und logischen Operatoren können Sie leistungsstarke Filterausdrücke erstellen, um Ihre Suchergebnisse einzugrenzen und die benötigten Daten effizient abzurufen.
FAQ
Gibt es eine Begrenzung für die Länge der Liste der übereinstimmenden Werte in Filterbedingungen (z. B. filter='color in ["red", "green", "blue"]')? Was sollte ich tun, wenn die Liste zu lang ist?
Zilliz Cloud legt keine Längenbeschränkung für die Liste der Übereinstimmungswerte in Filterbedingungen fest. Wenn Ihre Filterbedingung eine lange Liste von Übereinstimmungswerten oder einen komplexen Ausdruck mit vielen Elementen enthält, empfehlen wir die Verwendung von Filter Templating, um die Abfrageleistung zu verbessern.