Musterabgleich

In agentenbasierten Suchanwendungen ergänzen sich Vektorsuche und Musterabgleich im Grep-Stil häufig gegenseitig. Die Vektorsuche liefert semantisch relevante Entitäten, während der Musterabgleich diese Ergebnisse anhand exakter Zeichenfolgenstrukturen wie Fehlercodes, Protokollpräfixe, E-Mail-Domänen, URL-Pfade oder Identifikatoren eingrenzt.

In Milvus können Sie diese Musterbeschränkungen in skalaren Filtern ausdrücken: mit „ LIKE “ für einfache Platzhalterabgleiche und mit „ =~ “ oder „ !~ “ für RE2-reguläre Ausdrücke. Sie können diese Filter mit „ query “, „ search “ oder der hybriden Suche kombinieren.

Auf dieser Seite wird der Musterabgleich in skalaren Filterausdrücken beschrieben, die von „ query “, „ search “ und der hybriden Suche verwendet werden. Diese Ausdrücke werten Feldwerte aus und ändern die von einem Analysator erzeugten Token nicht. Informationen zum Filtern von Token während der Textanalyse finden Sie unter „Regex-Analysator-Filter“.

Ausdrücke für den Musterabgleich werden im Parameter „ filter “ angegeben. Die folgende Abfrage findet beispielsweise Protokollmeldungen, die einen Fehlercode wie „ E1001 “ enthalten:

from pymilvus import MilvusClient

client = MilvusClient(uri="http://localhost:19530")

res = client.query(
    collection_name="log_events",
    filter='message =~ "E[0-9]{4}"',
    output_fields=["message", "severity"],
)

Die Beispiele auf dieser Seite konzentrieren sich auf den Ausdruck, der dem Parameter „ filter “ zugewiesen ist. Sie können dieselbe Syntax für Filterausdrücke in Milvus-Operationen verwenden, die einen skalaren Filter akzeptieren, wie z. B. „ query “, „ search “ und die Hybrid-Suche.

Unterstützte Feldtypen

Die Mustererkennung ist für Zeichenfolgenwerte verfügbar.

ZielLIKERegex =~ / !~Hinweise
VARCHAR FeldJaJaTypisches Ziel für den Musterabgleich bei Zeichenfolgenfeldern.
JSON Pfad mit Typumwandlung „ VARCHARJaJaDer JSON-Pfadwert muss eine Zeichenkette sein, damit eine Übereinstimmung erzielt wird. Wenn Sie zur Beschleunigung einen Index auf dem JSON-Pfad erstellen, setzen Sie „ json_cast_type="varchar" “.
ARRAY<VARCHAR> elementJaJaGibt ein bestimmtes Element anhand des Index an, z. B. „ tags[0] “. Beim Musterabgleich werden nicht alle Elemente durchsucht; er gilt nur für das Element am angegebenen Index.
Numerische, boolesche, Vektor-, „ TEXT “- oder andere Nicht-VARCHAR -ZieleNeinNeinDer Musterabgleich ist nur für „ VARCHAR “-Werte, JSON-Pfade, die zu Zeichenfolgen aufgelöst werden, oder indizierte „ ARRAY<VARCHAR> “-Elemente verfügbar.

Wählen Sie „LIKE“ oder „regex“

Wählen Sie den einfachsten Operator, der das gewünschte Muster ausdrückt.

Wenn Sie eine exakte Zeichenfolgenübereinstimmung benötigen, empfehlen wir Ihnen, „ == “ anstelle des Musterabgleichs zu verwenden. Verwenden Sie „ LIKE “ oder „regex“ nur, wenn der Filter einem Muster entsprechen muss.

AnforderungEmpfohlener OperatorBeispielBeschreibung
Exakte Zeichenfolgenübereinstimmung==status == "active"Exakte Übereinstimmung der Zeichenfolge „ active “.
Einfache PräfixübereinstimmungLIKEname LIKE "Prod%"Übereinstimmung mit Zeichenfolgen, die mit „ Prod “ beginnen.
Einfache SuffixübereinstimmungLIKEfilename LIKE "%.json"Findet Zeichenfolgen, die mit „ .json “ enden.
Einfache „Enthält“-ÜbereinstimmungLIKEdescription LIKE "%vector database%"Sucht nach Werten, die an beliebiger Stelle im String „ vector database “ enthalten.
Strukturierten Code oder Muster mit fester Länge abgleichen=~code =~ "E[0-9]{4}"Sucht nach Zeichenfolgen, die (unter Berücksichtigung der Groß-/Kleinschreibung) „ E “ gefolgt von vier Ziffern enthalten, z. B. „ E1001 “.
Musterabgleich ohne Berücksichtigung der Groß-/Kleinschreibung=~ mit (?i)message =~ "(?i)error"Erkennt „ error “, „ ERROR “ oder andere Varianten mit Groß- und Kleinschreibung.
Werte ausschließen, die einem Regex-Muster entsprechen!~message !~ "^DEBUG"Schließt Zeichenfolgen aus, die mit „ DEBUG “ beginnen.

Verwenden Sie „ LIKE “ für den einfachen Platzhalterabgleich. Verwenden Sie „regex“, wenn das Muster Zeichenklassen, Wiederholungen, Alternativen wie „ error|failed “, Anker oder einen Abgleich ohne Berücksichtigung der Groß-/Kleinschreibung erfordert.

Verwenden Sie „LIKE“

Der Operator „ LIKE “ dient zum einfachen Abgleich mit Platzhaltern bei Zeichenfolgenwerten. Er unterstützt nur die folgenden Platzhalter:

PlatzhalterBeschreibung
%Stimmt mit null oder mehr Zeichen überein.
_Entspricht genau einem Zeichen.

Gängige LIKE-Muster

Verwenden Sie die Position von „ % “ und „ _ “, um zu steuern, an welcher Stelle der feste Text in der übereinstimmenden Zeichenfolge erscheint.

AnforderungMusterFilterbeispiel
Beginnt mit einem PräfixProd%filter = 'name LIKE "Prod%"'
Endet mit einem Suffix%.jsonfilter = 'filename LIKE "%.json"'
Enthält eine Teilzeichenfolge%vector%filter = 'description LIKE "%vector%"'
Stimmt mit einem Zeichen an einer festen Position übereinAB_%filter = 'code LIKE "AB_%"'

LIKE-Übereinstimmungsverhalten

Verwenden Sie „ LIKE “ für Präfix-, Suffix-, „enthält“- und Einzelzeichen-Übereinstimmungen an einer festen Position. „ LIKE “ unterstützt keine Zeichenklassen wie „ [0-9] “, keine Alternativen wie „ error|failed “, keine Wiederholungsanzahlen wie „ {4} “, keine Anker wie „ ^ “ oder „ $ “ und keine Flags zur Groß-/Kleinschreibung wie „ (?i) “. Verwenden Sie für diese Muster reguläre Ausdrücke.

Verwenden Sie „ == “ für die exakte Übereinstimmung der gesamten Zeichenfolge. Verwenden Sie „ LIKE “ nur, wenn der Filter eine Übereinstimmung mit Platzhaltern erfordert.

Escaping von Platzhaltern in einem LIKE-Muster

In „ LIKE “-Mustern entspricht „ % “ null oder mehr Zeichen und „ _ “ genau einem Zeichen. Um „ % “, „ _ “ oder „ \ “ wörtlich abzugleichen, müssen Sie das Zeichen mit einem Backslash (\) escapen:

  • name LIKE r"\%" entspricht dem literalen Wert „ % “.
  • name LIKE r"\_%" passt auf Werte, die mit dem Literal „ _ “ beginnen.
  • name LIKE r"\\%" passt auf Werte, die mit einem literalen Backslash beginnen.

Raw-String-Literale, geschrieben als r"..." oder r'...', behalten Backslashes in Milvus-Filterausdrücken unverändert bei. Sie werden für „ LIKE “ und Regex-Muster empfohlen, die Backslashes enthalten. Ohne einen Raw-String verarbeiten gewöhnliche String-Literale weiterhin Escape-Sequenzen, bevor das Muster ausgewertet wird, sodass möglicherweise mehr Backslashes erforderlich sind.

Verwenden Sie RegexCompatible with Milvus 3.0.x

Verwenden Sie Regex-Filter, wenn das Muster Funktionen regulärer Ausdrücke wie Zeichenklassen, Wiederholungen, Alternativen, Anker oder groß-/kleinschreibungsunabhängige Übereinstimmungen erfordert. Milvus wendet einen RE2-regulären Ausdruck auf einen Zeichenfolgenwert an.

Die rechte Seite von „ =~ “ oder „ !~ “ muss ein String-Literal sein.

OperatorBedeutungBeispiel
=~Passt auf Werte, die dem Regex-Muster entsprechen.filter = 'message =~ "E[0-9]{4}"'
!~Schließt Werte aus, die dem Regex-Muster entsprechen.filter = 'message !~ "^DEBUG"'

Verwenden Sie Raw-String-Literale

Raw-String-Literale werden für Regex-Muster empfohlen, die Backslashes enthalten. In einem Raw-String, der als „ r"..." “ oder „ r'...' “ geschrieben wird, werden Backslashes unverändert an die Regex-Engine übergeben. Dadurch entfällt die zusätzliche Escape-Behandlung, die bei gewöhnlichen String-Literalen erforderlich ist.

Beispiel:

filter = 'message =~ r"\d{4}-\d{2}-\d{2}"'

Dies passt auf Zeichenfolgen, die einen datumsähnlichen Wert enthalten, wie z. B. 2026-07-01.

Ohne eine Raw-Zeichenkette verarbeiten gewöhnliche String-Literale Escape-Sequenzen, bevor das Regex-Muster ausgewertet wird, sodass Muster wie \d, \s oder escaped Literalzeichen möglicherweise zusätzliche Backslashes erfordern.

Gängige reguläre Ausdrücke

Die folgenden Beispiele verwenden gängige RE2-Syntax in Milvus-Filterausdrücken. Die vollständige Syntax für reguläre Ausdrücke finden Sie in der RE2-Syntaxreferenz.

AnforderungMusterFilterbeispiel
Enthält wörtlichen Texterrorfilter = 'message =~ "error"'
Beginnt mit einem Präfix^ERRfilter = 'code =~ "^ERR"'
Endet mit einem Suffix\.json$filter = 'filename =~ "\\.json$"'
Stimmt mit einer Ziffernfolge überein[0-9]+filter = 'message =~ "[0-9]+"'
Stimmt mit einer festen Anzahl von Ziffern überein[0-9]{4}filter = 'code =~ "[0-9]{4}"'
Stimmt mit einer E-Mail-Domain überein@example\.com$filter = 'email =~ "@example\\.com$"'
Übereinstimmung unabhängig von Groß-/Kleinschreibung(?i)errorfilter = 'message =~ "(?i)error"'
Stimmt mit der gesamten Zeichenfolge überein^prod-[0-9]+$filter = 'name =~ "^prod-[0-9]+$"'

Um eines von mehreren Wörtern zu finden, verwenden Sie die Alternative mit „ | “:

filter = 'message =~ "error|failed|timeout"'

Wenn Sie Regex-Metazeichen wörtlich abgleichen möchten, müssen Sie diese im Regex-Muster mit einem Escape-Zeichen versehen. Um beispielsweise einen wörtlichen Punkt (\. in Regex) abzugleichen, schreiben Sie \\. in eine Python-Filterzeichenfolge:

filter = 'email =~ "@gmail\\.com$"'

Hinweis: Milvus-Regex-Filter folgen der RE2-Syntax. Wenn ein Regex-Muster eine Syntax verwendet, die RE2 nicht unterstützt, oder anderweitig ungültig ist, lehnt Milvus den Filterausdruck ab. Einzelheiten zu Regex-Metazeichen, Flags und dem Abgleichverhalten finden Sie in der RE2-Syntaxreferenz.

Übereinstimmungsverhalten

Teilzeichenfolgenabgleich

Der Milvus-Regex-Abgleich verwendet die Semantik von Teilzeichenfolgen. Das Muster muss nicht mit dem gesamten Feldwert übereinstimmen. Der folgende Filter passt beispielsweise sowohl auf „ E1001 “ als auch auf „ failed with E1001 after retry “:

filter = 'message =~ "E[0-9]{4}"'

Um den gesamten Feldwert abzugleichen, verwenden Sie die Anker „ ^ “ und „ $ “:

# Match only values that are exactly E followed by four digits
filter = 'code =~ "^E[0-9]{4}$"'

Nullfähige VARCHAR-Felder

Regex-Filter finden keine Übereinstimmungen mit Nullwerten. Dies gilt sowohl für „ =~ “ als auch für „ !~ “. Wenn Sie ein Regex-Muster ausschließen, aber Nullwerte beibehalten möchten, fügen Sie explizit „ OR field IS NULL “ hinzu:

filter = 'message !~ "^DEBUG" OR message IS NULL'

JSON-Pfade

Bei JSON-Pfaden verhalten sich Regex-Filter unterschiedlich, wenn der Pfad fehlt, den Wert „null“ hat oder zu einem Wert führt, der kein String ist:

FilterBezieht fehlende/Null-/Nicht-String-Werte ein?Hinweise
json_field["path"] =~ "pattern"NeinErkennt nur Zeichenfolgenwerte, die dem Regex-Muster entsprechen.
json_field["path"] !~ "pattern"JaGibt Entitäten zurück, bei denen der Pfad fehlt, null ist, kein String ist oder ein String ist, der nicht dem regulären Ausdruck entspricht.

Beschleunigung des Musterabgleichs durch Indizes

Milvus unterstützt mehrere Indextypen für Zeichenfolgenfelder, die zusammen mit „ LIKE “- und Regex-Filtern für „ VARCHAR “-Felder oder JSON-Zeichenfolgenpfade verwendet werden können, z. B. „ NGRAM “, „ STL_SORT “, „ INVERTED “ und „ BITMAP “. Der Musterabgleich funktioniert zwar auch ohne Index, doch ein Index kann die Leistung bei großen Datensätzen verbessern.

Die Wirksamkeit des Indexes hängt vom Musterausdruck ab, davon, ob Milvus feste Literal-Teilstrings extrahieren kann, sowie von der Kardinalität und der Verteilung des Zielfeldes. Präfixmuster wie name LIKE "Prod%" profitieren möglicherweise von anderen Indexstrategien als Infix- oder Suffixmuster wie description LIKE "%vector%" oder filename LIKE "%.json".

Verwenden Sie die folgende Tabelle als Ausgangspunkt und führen Sie anschließend einen Benchmark mit Ihrer eigenen Arbeitslast durch:

Muster oder DatenmerkmalZu berücksichtigender IndexAnmerkungen
Enthält feste Literal-Teilstrings, wie z. B. message =~ "error.*timeout" oder message LIKE "%database%"NGRAMHilfreich, wenn Milvus aussagekräftige Literal-Teilstrings aus dem Muster extrahieren kann. Weitere Informationen finden Sie unter NGRAM.
Präfix-, exakte oder gleichheitsähnliche Zeichenfolgenfilter, insbesondere bei Feldern mit geringer bis mittlerer KardinalitätSTL_SORT, „ INVERTED “ oder BITMAPKönnen effektiver sein, wenn das Feld wiederholte Werte enthält oder wenn der Filter nahe an einer exakten Übereinstimmung liegt. Weitere Informationen finden Sie unter STL_SORT, INVERTED und BITMAP.
Regex-Muster ohne feste Literale oder Muster, die von Zeichenklassen, kurzen Tokens oder Platzhaltern dominiert werdenFühren Sie einen Benchmark durch, bevor Sie sich auf die Indexbeschleunigung verlassenDiese Muster bieten möglicherweise nur eine begrenzte Indexselektivität und können auf umfassendere Scans zurückgreifen.