Una ricerca vettoriale filtrata è costituita da un vettore di query e da un filtro per un campo specifico. AlloyDB Omni utilizza le ricche funzionalità di query di PostgreSQL, consentendoti di eseguire ricerche vettoriali ed eseguire query su dati strutturati e non strutturati da un'unica interfaccia SQL.
Opzioni di filtro
Lo strumento di ottimizzazione delle query di AlloyDB Omni svolge un ruolo fondamentale nel determinare la strategia di filtraggio più efficiente per la ricerca vettoriale.
Per stimare il costo di diversi piani di esecuzione, l'ottimizzatore delle 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, lo strumento di ottimizzazione sceglie una strategia di filtraggio ottimale tra le seguenti:
Prefiltraggio
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 tuoi criteri anziché eseguire la ricerca nell'intero set di dati. Poi, AlloyDB Omni esegue la ricerca vettoriale su questo gruppo più piccolo.
Ad esempio, se cerchi camicie blu simili, AlloyDB Omni trova prima tutte le camicie blu e poi cerca articoli simili all'interno di questo gruppo.
Questa strategia migliora il rendimento perché esegue la ricerca di similarità vettoriale a elevato utilizzo di risorse di calcolo su un set di dati ridotto.
Post-filtering
Il post-filtraggio è una strategia utilizzata da AlloyDB Omni quando i filtri non restringono in modo significativo i risultati. Anziché filtrare per prima cosa, AlloyDB Omni inizia trovando un ampio elenco di elementi simili in base alla ricerca vettoriale. Quindi, confronta i risultati con le 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, dato che la maggior parte dei film potrebbe essere drammatico.
Questa strategia è efficiente quando prevedi che molti risultati corrispondano al filtro.
Filtro in linea
Il filtro 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 ricerche 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 una rapida valutazione di queste condizioni.
Ad esempio, se cerchi scarpe simili e filtri per color = black, il filtro in linea significa che AlloyDB Omni controlla solo la somiglianza delle scarpe già nere. È più efficiente rispetto a controllare la somiglianza di tutte le scarpe e poi filtrare per colore o filtrare tutte le scarpe per colore e poi controllare la somiglianza.
Il filtro in linea è ideale quando i filtri restringono moderatamente i risultati.
Informazioni sui piani di query
Un piano di query fornisce una visione completa del processo di esecuzione della query e mostra quale strategia di filtro sceglie 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 seguente query mostra il filtro incorporato per una ricerca 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 query di esempio illustra una ricerca vettoriale ottimizzata utilizzando il filtro incorporato:
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 filtro incorporato mostra Bitmap assisted vector Scan on products_embedding_index nel campo Strategia di esecuzione, il che indica che la scansione vettoriale utilizza la bitmap per creare un elenco ristretto 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'attributo Order By: (embedding <=> '[...]')::vector indica che i risultati sono ordinati in base alla somiglianza 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.