Una ricerca vettoriale filtrata è costituita da un vettore di query e da un filtro per un campo specifico. AlloyDB Omni utilizza le funzionalità di query avanzate di PostgreSQL, consentendoti di eseguire la ricerca vettoriale ed eseguire query su dati strutturati e non strutturati da un'unica interfaccia SQL.
Opzioni di filtro
L'ottimizzatore di query di AlloyDB Omni svolge un ruolo fondamentale nel determinare la strategia di filtro più efficiente per la ricerca vettoriale.
Per stimare il costo dei diversi piani di esecuzione, l'ottimizzatore di query analizza la query e prende in considerazione fattori quali la selettività dei filtri, la distribuzione dei dati e la disponibilità degli indici.
In base alla stima dei costi, l'ottimizzatore sceglie una strategia di filtro ottimale tra le seguenti:
Pre-filtraggio
Il pre-filtraggio è una strategia di ottimizzazione delle query in cui AlloyDB Omni utilizza i filtri per trovare un gruppo più piccolo di elementi che corrispondono ai criteri anziché cercare nell'intero set di dati. Quindi, AlloyDB Omni esegue la ricerca vettoriale su questo gruppo più piccolo.
Ad esempio, se stai cercando magliette blu simili, AlloyDB Omni trova prima tutte le magliette blu e poi cerca gli articoli simili all'interno di questo gruppo.
Questa strategia migliora le prestazioni perché esegue la ricerca di similarità vettoriale a elevato utilizzo di risorse di calcolo su un set di dati ridotto.
Post-filtraggio
Il post-filtraggio è una strategia che AlloyDB Omni utilizza quando i filtri non restringono notevolmente i risultati. Anziché filtrare per prima, AlloyDB Omni inizia trovando un ampio elenco di articoli simili in base alla ricerca vettoriale. Poi, controlla i risultati in base alle condizioni del filtro per generare l'elenco finale.
Ad esempio, se cerchi film simili e hai un filtro molto ampio come genre = drama, AlloyDB Omni trova prima un ampio insieme di film simili alla tua ricerca e poi li filtra per genere, poiché la maggior parte dei film potrebbe essere di genere drammatico.
Questa strategia è efficiente quando prevedi che molti risultati corrispondano al filtro.
Filtraggio in linea
Il filtraggio in linea è una strategia di ottimizzazione delle query in cui AlloyDB Omni utilizza sia gli indici vettoriali sia altri indici secondari per eseguire la ricerca vettoriale e la valutazione dei filtri in tandem. AlloyDB Omni esegue la ricerca nell'indice vettoriale per trovare vettori simili e controlla anche se ogni vettore corrisponde alle condizioni del filtro dei metadati, sfruttando indici come B-tree, GIN o GiST per la valutazione rapida di queste condizioni.
Ad esempio, se cerchi scarpe simili e filtri in base a color = black, il filtraggio in linea significa che AlloyDB Omni controlla solo la similarità delle scarpe già nere. Questa operazione è più efficiente rispetto al controllo della similarità di tutte le scarpe e poi al filtraggio per colore o al filtraggio di tutte le scarpe per colore e poi al controllo della similarità.
Il filtraggio in linea è ottimale quando i filtri restringono moderatamente i risultati.
Informazioni sui piani di query
Un piano di query fornisce una visione completa del processo di esecuzione delle query e mostra la strategia di filtro scelta da AlloyDB Omni per l'operazione di scansione vettoriale nel campo Strategia di esecuzione.
Un piano di query per il filtraggio in linea
Per il filtraggio in linea, AlloyDB Omni utilizza un nodo del piano di scansione personalizzata, noto anche come scansione vettoriale, che si basa su un nodo del piano di scansione dell'indice bitmap per fornire la bitmap per le clausole di filtro.
La scansione vettoriale calcola le distanze solo per le righe che soddisfano i criteri di filtro.
La query seguente mostra il filtraggio in linea per una ricerca di shoes filtrata in base a color = black
EXPLAIN
SELECT *
FROM products
WHERE color = 'black'
ORDER BY embedding <=> embedding('text-embedding-005', 'shoes')::vector
LIMIT 10;
Il seguente piano di query di esempio illustra una ricerca vettoriale ottimizzata utilizzando il filtraggio in linea:
Limit (actual rows=10)
-> Custom Scan (vector scan) on products
Execution Strategy: Bitmap assisted vector Scan on products_embedding_index
Order By: (embedding <=> '[...]')::vector)
Limit: 10
-> Bitmap Index Scan on products (color_index)
Index Cond: (color = 'black')
Nel piano di query di esempio, Limit (actual rows=10) mostra che la query ha utilizzato la clausola SQL LIMIT 10; per limitare l'output. actual rows=10 significa che questo nodo ha restituito 10 righe durante l'esecuzione della query.
Il nodo -> Custom Scan (vector scan) on products rappresenta un'operazione di ricerca vettoriale. Si tratta di una scansione personalizzata perché è una scansione speciale per i dati vettoriali e opera sulla tabella products.
Il piano di query di esempio per il filtraggio in linea mostra Bitmap assisted vector Scan on products_embedding_index nel campo Strategia di esecuzione, che indica che la scansione vettoriale utilizza la bitmap per creare un elenco breve di righe su cui deve essere eseguita la ricerca di similarità. La scansione dell'indice bitmap viene utilizzata per filtrare i dati in base alla condizione color = 'black'.
L'Order By: (embedding <=> '[...]')::vector attributo indica che i risultati sono ordinati in base alla similarità vettoriale, calcolata utilizzando l'espressione (embedding <=> '[...]')::vector, dove embedding si riferisce alla colonna vettoriale, <=> rappresenta l'operatore del vicino più prossimo, [...] è il vettore di query e ::vector esegue il casting del tipo al tipo di dati vettoriale.
Il nodo -> Bitmap Index Scan on products (color_index) rappresenta una scansione dell'indice bitmap su colors_index. Una scansione dell'indice bitmap seleziona le righe che corrispondono alla condizione di filtro utilizzando una bitmap e utilizza color_index per il filtraggio.
L'attributo Index Cond: (color = 'black') specifica la condizione di filtro utilizzata dalla scansione dell'indice color = 'black' dalla clausola WHERE della query.