Corrispondenza dei pattern

Nelle applicazioni di ricerca agentica, la ricerca vettoriale e la corrispondenza dei pattern in stile grep spesso si integrano a vicenda. La ricerca vettoriale recupera le entità semanticamente rilevanti, mentre la corrispondenza dei pattern restringe tali risultati in base a strutture di stringhe esatte, quali codici di errore, prefissi di log, domini e-mail, percorsi URL o identificatori.

In Milvus, è possibile esprimere questi vincoli di pattern nei filtri scalari utilizzando LIKE per la semplice corrispondenza con caratteri jolly e =~ o !~ per le espressioni regolari RE2. È possibile combinare questi filtri con query, search o la ricerca ibrida.

Questa pagina descrive la corrispondenza dei pattern nelle espressioni di filtro scalare utilizzate da query, search e dalla ricerca ibrida. Queste espressioni valutano i valori dei campi e non modificano i token prodotti da un analizzatore. Per filtrare i token durante l’analisi del testo, consultare Filtro dell’analizzatore Regex.

Le espressioni di corrispondenza dei pattern vengono scritte nel parametro filter. Ad esempio, la seguente query individua i messaggi di log che contengono un codice di errore come E1001:

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"],
)

Gli esempi in questa pagina si concentrano sull’espressione assegnata a ` filter`. È possibile utilizzare la stessa sintassi dell’espressione di filtro nelle operazioni di Milvus che accettano un filtro scalare, come ` query`, ` search` e la ricerca ibrida.

Tipi di campo supportati

La corrispondenza dei pattern è disponibile per i valori stringa.

DestinazioneLIKERegex =~ / !~Note
VARCHAR campoDestinazione tipica per la corrispondenza di pattern nei campi stringa.
JSON percorso con tipo di conversione " VARCHAR "Il valore del percorso JSON deve essere una stringa per ottenere corrispondenze positive. Se si crea un indice sul percorso JSON per l'accelerazione, impostare json_cast_type="varchar".
ARRAY<VARCHAR> elementoCorrisponde a un elemento specifico in base all'indice, ad esempio tags[0]. La corrispondenza del pattern non esegue la scansione di tutti gli elementi; si applica solo all'elemento all'indice specificato.
Destinazioni numeriche, booleane, vettoriali, TEXT o altre destinazioni nonVARCHAR NoNoLa corrispondenza con il pattern è disponibile solo per i valori di tipo " VARCHAR ", i percorsi JSON che si risolvono in stringhe o gli elementi " ARRAY<VARCHAR> " indicizzati.

Scegliere LIKE o regex

Scegli l’operatore più semplice che esprima il modello di cui hai bisogno.

Se hai bisogno di una corrispondenza esatta della stringa, ti consigliamo di utilizzare == invece del pattern matching. Usa LIKE o regex solo quando il filtro deve corrispondere a un pattern.

RequisitiOperatore consigliatoEsempioDescrizione
Uguaglianza esatta della stringa==status == "active"Corrispondenza esatta della stringa active.
Corrispondenza semplice del prefissoLIKEname LIKE "Prod%"Corrisponde alle stringhe che iniziano con Prod.
Corrispondenza semplice del suffissoLIKEfilename LIKE "%.json"Corrisponde alle stringhe che terminano con .json.
Corrispondenza semplice "contiene"LIKEdescription LIKE "%vector database%"Trova i valori che contengono vector database in qualsiasi punto della stringa.
Corrispondenza di un codice strutturato o di un modello a lunghezza fissa=~code =~ "E[0-9]{4}"Trova stringhe che, distinguendo tra maiuscole e minuscole, contengono E seguito da quattro cifre, ad esempio E1001.
Corrispondenza di pattern senza distinzione tra maiuscole e minuscole=~ con (?i)message =~ "(?i)error"Trova error, ERROR o altre varianti con maiuscole e minuscole.
Escludi i valori che corrispondono a un modello regex!~message !~ "^DEBUG"Esclude le stringhe che iniziano con DEBUG.

Utilizza LIKE per una semplice corrispondenza con caratteri jolly. Utilizza regex quando il modello richiede classi di caratteri, ripetizioni, alternanze come error|failed, ancore o corrispondenze senza distinzione tra maiuscole e minuscole.

Utilizzare LIKE

L'operatore LIKE serve per semplici corrispondenze con caratteri jolly su valori di stringa. Supporta solo i seguenti caratteri jolly:

Carattere jollyDescrizione
%Corrisponde a zero o più caratteri.
_Corrisponde esattamente a un carattere.

Modelli LIKE comuni

Utilizza la posizione di % e _ per controllare dove appare il testo fisso nella stringa corrispondente.

RequisitiModelloEsempio di filtro
Inizia con un prefissoProd%filter = 'name LIKE "Prod%"'
Termina con un suffisso%.jsonfilter = 'filename LIKE "%.json"'
Contiene una sottostringa%vector%filter = 'description LIKE "%vector%"'
Corrisponde a un carattere in una posizione fissaAB_%filter = 'code LIKE "AB_%"'

Comportamento di corrispondenza LIKE

Utilizzare LIKE per le corrispondenze di prefisso, suffisso, contenuto e singolo carattere in posizione fissa. LIKE non supporta classi di caratteri come [0-9], alternanze come error|failed, conteggi di ripetizioni come {4}, ancore come ^ o $, né flag di ignoranza maiuscole/minuscole come (?i). Per tali pattern, utilizzare le espressioni regolari.

Utilizza == per l'uguaglianza esatta dell'intera stringa. Utilizza LIKE solo quando il filtro richiede la corrispondenza con caratteri jolly.

Escape dei caratteri jolly in un modello LIKE

Nei modelli LIKE, % corrisponde a zero o più caratteri e _ corrisponde esattamente a un carattere. Per trovare una corrispondenza letterale con %, _ o \, si deve eseguire l'escape del carattere con una barra rovesciata (\):

  • name LIKE r"\%" corrisponde al valore letterale %.
  • name LIKE r"\_%" corrisponde ai valori che iniziano con il carattere letterale _.
  • name LIKE r"\\%" corrisponde ai valori che iniziano con una barra rovesciata letterale.

I letterali di stringa grezzi, scritti come r"..." o r'...', mantengono le barre rovesciate tali e quali nelle espressioni dei filtri di Milvus. Sono consigliati per LIKE e per i pattern regex che contengono barre rovesciate. Senza una stringa grezza, i normali letterali di stringa elaborano comunque le sequenze di escape prima che il pattern venga valutato, quindi potrebbero essere necessarie più barre rovesciate.

Utilizzare le espressioni regolariCompatible with Milvus 3.0.x

Utilizzate i filtri regex quando il pattern richiede funzionalità delle espressioni regolari quali classi di caratteri, ripetizioni, alternanze, ancore o corrispondenze che non distinguono tra maiuscole e minuscole. Milvus applica un'espressione regolare RE2 a un valore stringa.

Il lato destro di =~ o !~ deve essere un letterale stringa.

OperatoreSignificatoEsempio
=~Corrisponde ai valori che soddisfano il modello regex.filter = 'message =~ "E[0-9]{4}"'
!~Esclude i valori che soddisfano il modello regex.filter = 'message !~ "^DEBUG"'

Utilizzare stringhe letterali "raw"

I letterali stringa grezzi sono consigliati per i modelli regex che contengono barre rovesciate. In una stringa grezza, scritta come r"..." o r'...', le barre rovesciate vengono passate al motore regex alla lettera. Ciò evita l'escape aggiuntivo richiesto dai normali letterali stringa.

Ad esempio:

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

Questo corrisponde a stringhe che contengono un valore simile a una data, come 2026-07-01.

Senza una stringa raw, le stringhe letterali ordinarie elaborano le sequenze di escape prima che il pattern regex venga valutato, quindi pattern come \d, \s o caratteri letterali con escape potrebbero richiedere barre rovesciate aggiuntive.

Modelli di espressioni regolari comuni

Gli esempi seguenti utilizzano la sintassi RE2 comune nelle espressioni dei filtri di Milvus. Per la sintassi completa delle espressioni regolari, consultare il riferimento alla sintassi RE2.

RequisitoModelloEsempio di filtro
Contiene testo letteraleerrorfilter = 'message =~ "error"'
Inizia con un prefisso^ERRfilter = 'code =~ "^ERR"'
Termina con un suffisso\.json$filter = 'filename =~ "\\.json$"'
Corrisponde a una sequenza di cifre[0-9]+filter = 'message =~ "[0-9]+"'
Corrisponde a un numero fisso di cifre[0-9]{4}filter = 'code =~ "[0-9]{4}"'
Corrisponde a un dominio e-mail@example\.com$filter = 'email =~ "@example\\.com$"'
Corrisponde senza distinzione tra maiuscole e minuscole(?i)errorfilter = 'message =~ "(?i)error"'
Corrisponde alla stringa completa^prod-[0-9]+$filter = 'name =~ "^prod-[0-9]+$"'

Per trovare una delle diverse parole, usa l'alternanza con |:

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

Quando si effettuano corrispondenze letterali con i metacaratteri delle espressioni regolari, è necessario eseguire l'escape all'interno del pattern. Ad esempio, per trovare un punto letterale (\. nell'espressione regolare), scrivere \\. in una stringa di filtro Python:

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

Nota: i filtri regex di Milvus seguono la sintassi RE2. Se un modello regex utilizza una sintassi non supportata da RE2 o è altrimenti non valido, Milvus rifiuta l’espressione del filtro. Per i dettagli sui metacaratteri regex, i flag e il comportamento di corrispondenza, consultare il riferimento alla sintassi RE2.

Comportamento di corrispondenza

Corrispondenza di sottostringhe

La corrispondenza delle espressioni regolari di Milvus utilizza la semantica delle sottostringhe. Il modello non deve necessariamente corrispondere all’intero valore del campo. Ad esempio, il seguente filtro corrisponde sia a E1001 che a failed with E1001 after retry:

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

Per trovare corrispondenze con l’intero valore del campo, utilizzare gli ancoraggi ^ e $:

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

Campi VARCHAR nullabili

I filtri Regex non individuano i valori nulli. Ciò vale sia per =~ che per !~. Se si desidera escludere un pattern Regex ma mantenere i valori nulli, aggiungere esplicitamente OR field IS NULL:

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

Percorsi JSON

Per i percorsi JSON, i filtri regex si comportano in modo diverso quando il percorso è mancante, nullo o si risolve in un valore non stringa:

FiltroInclude valori mancanti/null/non stringa?Note
json_field["path"] =~ "pattern"NoCorrisponde solo ai valori stringa che soddisfano il modello regex.
json_field["path"] !~ "pattern"Restituisce le entità in cui il percorso è mancante, nullo, non di tipo stringa o una stringa che non corrisponde al modello regex.

Accelerare la corrispondenza dei pattern con gli indici

Milvus supporta diversi tipi di indici sui campi stringa che possono essere utilizzati insieme a filtri " LIKE " e filtri regex su campi " VARCHAR " o percorsi stringa JSON, come NGRAM, STL_SORT, INVERTED e BITMAP. La corrispondenza dei pattern può funzionare senza un indice, ma un indice può migliorare le prestazioni su set di dati di grandi dimensioni.

L'efficacia dell'indice dipende dall'espressione del pattern, dalla capacità di Milvus di estrarre sottostringhe letterali fisse, nonché dalla cardinalità e dalla distribuzione del campo di destinazione. I pattern di tipo prefisso, come name LIKE "Prod%", possono trarre vantaggio da strategie di indicizzazione diverse rispetto ai pattern di tipo infisso o suffisso, come description LIKE "%vector%" o filename LIKE "%.json".

Utilizzate la tabella seguente come punto di partenza, quindi effettuate un benchmark con il vostro carico di lavoro:

Modello o caratteristica dei datiIndice da prendere in considerazioneNote
Contiene sottostringhe letterali fisse, come message =~ "error.*timeout" o message LIKE "%database%"NGRAMUtile quando Milvus è in grado di estrarre sottostringhe letterali significative dal modello. Per ulteriori dettagli, consultare NGRAM.
Filtri di stringa prefissati, esatti o simili all’uguaglianza, specialmente su campi con cardinalità da bassa a moderataSTL_SORT, INVERTED o BITMAPPossono risultare più efficaci quando il campo presenta valori ripetuti o quando il filtro si avvicina alla corrispondenza esatta. Per i dettagli, fare riferimento a STL_SORT, INVERTED e BITMAP.
Modelli Regex senza letterali fissi, o modelli dominati da classi di caratteri, token brevi o caratteri jollyEseguire un benchmark prima di fare affidamento sull’accelerazione tramite indiceQuesti modelli potrebbero fornire una selettività dell’indice limitata e ricorrere a scansioni più ampie.