Il filtraggio spiegato
Milvus offre potenti funzionalità di filtraggio che consentono di interrogare con precisione i dati. Le espressioni di filtro consentono di indirizzare campi scalari specifici e di affinare i risultati della ricerca con diverse condizioni. Questa guida spiega come utilizzare le espressioni di filtro in Milvus, con esempi incentrati sulle operazioni di interrogazione. È possibile applicare questi filtri anche nelle richieste di ricerca e cancellazione.
Operatori di base
Milvus supporta diversi operatori di base per filtrare i dati:
Operatori di confronto:
==,!=,>,<,>=, e<=permettono di filtrare in base a campi numerici o di testo.Filtri di intervallo:
INeLIKEaiutano a soddisfare intervalli o insiemi di valori specifici.Operatori aritmetici:
+,-,*,/,%e**sono utilizzati per i calcoli che coinvolgono i campi numerici.Operatori logici:
AND,OR, eNOTcombinano più condizioni in espressioni complesse.Operatori IS NULL e IS NOT NULL: Gli operatori
IS NULLeIS NOT NULLsono usati per filtrare i campi in base al fatto che contengano o meno un valore nullo (assenza di dati). Per maggiori dettagli, consultare la sezione Operatori di base.
Esempio: Filtro per colore
Per trovare entità con colori primari (rosso, verde o blu) in un campo scalare color, utilizzare la seguente espressione di filtro:
filter='color in ["red", "green", "blue"]'
Esempio: Filtrare i campi JSON
Milvus consente di fare riferimento a chiavi in campi JSON. Ad esempio, se si dispone di un campo JSON product con le chiavi price e model, e si desidera trovare prodotti con un modello specifico e un prezzo inferiore a 1.850, utilizzare questa espressione di filtro:
filter='product["model"] == "JSN-087" AND product["price"] < 1850'
Esempio: Filtrare i campi array
Se si dispone di un campo array history_temperatures contenente le registrazioni delle temperature medie riportate dagli osservatori a partire dall'anno 2000 e si desidera trovare gli osservatori in cui la temperatura del 2009 (la decima registrata) supera i 23°C, utilizzare questa espressione:
filter='history_temperatures[10] > 23'
Per ulteriori informazioni su questi operatori di base, consultare Operatori di base.
Modelli di espressioni di filtro
Quando si effettua il filtraggio utilizzando i caratteri CJK, l'elaborazione può essere più complessa a causa dei set di caratteri più grandi e delle differenze di codifica. Ciò può comportare un rallentamento delle prestazioni, soprattutto con l'operatore IN.
Milvus introduce la templatura delle espressioni di filtro per ottimizzare le prestazioni quando si lavora con i caratteri CJK. Separando i valori dinamici dall'espressione del filtro, il motore di query gestisce in modo più efficiente l'inserimento dei parametri.
Esempio
Per trovare persone di età superiore ai 25 anni che vivono a "北京" (Pechino) o "上海" (Shanghai), utilizzare la seguente espressione modello:
filter = "age > 25 AND city IN ['北京', '上海']"
Per migliorare le prestazioni, utilizzare questa variante con i parametri:
filter = "age > {age} AND city in {city}",
filter_params = {"age": 25, "city": ["北京", "上海"]}
Questo approccio riduce l'overhead del parsing e migliora la velocità della query. Per ulteriori informazioni, vedere Templatura dei filtri.
Operatori specifici per i tipi di dati
Milvus offre operatori di filtraggio avanzati per tipi di dati specifici, come i campi JSON, ARRAY e VARCHAR.
Operatori specifici per i campi JSON
Milvus offre operatori avanzati per l'interrogazione dei campi JSON, consentendo un filtraggio preciso all'interno di strutture JSON complesse:
JSON_CONTAINS(identifier, jsonExpr): Controlla se un'espressione JSON esiste nel campo.
# JSON data: {"tags": ["electronics", "sale", "new"]}
filter='json_contains(tags, "sale")'
JSON_CONTAINS_ALL(identifier, jsonExpr): Verifica che tutti gli elementi dell'espressione JSON siano presenti.
# JSON data: {"tags": ["electronics", "sale", "new", "discount"]}
filter='json_contains_all(tags, ["electronics", "sale", "new"])'
JSON_CONTAINS_ANY(identifier, jsonExpr): Filtra le entità in cui esiste almeno un elemento nell'espressione JSON.
# JSON data: {"tags": ["electronics", "sale", "new"]}
filter='json_contains_any(tags, ["electronics", "new", "clearance"])'
Per maggiori dettagli sugli operatori JSON, consultare Operatori JSON.
Operatori specifici del campo ARRAY
Milvus offre operatori di filtraggio avanzati per i campi array, come ARRAY_CONTAINS, ARRAY_CONTAINS_ALL, ARRAY_CONTAINS_ANY e ARRAY_LENGTH, che consentono un controllo a grana fine sui dati degli array:
ARRAY_CONTAINS: Filtra le entità contenenti un elemento specifico.
filter="ARRAY_CONTAINS(history_temperatures, 23)"
ARRAY_CONTAINS_ALL: Filtra le entità in cui sono presenti tutti gli elementi di un elenco.
filter="ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])"
ARRAY_CONTAINS_ANY: Filtra le entità contenenti qualsiasi elemento dell'elenco.
filter="ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])"
ARRAY_LENGTH: Filtra in base alla lunghezza dell'array.
filter="ARRAY_LENGTH(history_temperatures) < 10"
Per maggiori dettagli sugli operatori di array, vedere Operatori ARRAY.
Operatori specifici per i campi VARCHAR
Milvus offre operatori specializzati per ricerche precise basate sul testo nei campi VARCHAR:
TEXT_MATCH operatore
L'operatore TEXT_MATCH consente di recuperare documenti precisi in base a termini di interrogazione specifici. È particolarmente utile per le ricerche filtrate che combinano filtri scalari con ricerche di somiglianza vettoriale. A differenza delle ricerche semantiche, Text Match si concentra sulle occorrenze esatte dei termini.
Milvus utilizza Tantivy per supportare l'indicizzazione inversa e la ricerca testuale basata sui termini. Il processo prevede:
Analizzatore: Tokenizza ed elabora il testo in ingresso.
Indicizzazione: Crea un indice invertito che mappa i token unici nei documenti.
Per maggiori dettagli, fare riferimento a Corrispondenza di testo.
PHRASE_MATCH operatoreCompatible with Milvus 2.6.x
L'operatore PHRASE_MATCH consente di recuperare con precisione i documenti in base alle corrispondenze esatte tra le frasi, considerando sia l'ordine che l'adiacenza dei termini della query.
Per maggiori dettagli, consultare Phrase Match.