Panoramica della ricerca di vettori filtrati in AlloyDB

Questa pagina fornisce una panoramica della ricerca vettoriale filtrata in AlloyDB per PostgreSQL.

Una ricerca di vettori filtrati è composta da un vettore di query e da un filtro per un campo specifico. AlloyDB utilizza le ampie funzionalità di query di PostgreSQL, consentendo di eseguire ricerche vettoriali e query su dati strutturati e non strutturati da un'unica interfaccia SQL.

Opzioni di filtro

L'ottimizzatore delle query di AlloyDB svolge un ruolo fondamentale nella determinazione della strategia di filtro più efficiente per la ricerca di vettori.

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, l'ottimizzatore sceglie una strategia di filtro ottimale tra le seguenti:

Prefiltraggio

Il prefiltro è una strategia di ottimizzazione delle query in cui AlloyDB utilizza i filtri per trovare un gruppo più piccolo di elementi che soddisfano i tuoi criteri anziché eseguire la ricerca nell'intero set di dati. AlloyDB esegue quindi la ricerca vettoriale su questo gruppo più piccolo.

Ad esempio, se stai cercando camicie blu simili, AlloyDB trova prima tutte le camicie blu e poi cerca articoli simili all'interno di quel gruppo.

Questa strategia migliora le prestazioni perché esegue la ricerca di somiglianza di vettori ad alta intensità di calcolo su un set di dati ridotto.

Filtro post-elaborazione

Il post-filtro è una strategia utilizzata da AlloyDB quando i filtri non riducono notevolmente i risultati. Anziché applicare prima i filtri, AlloyDB inizia trovando un elenco ampio di elementi simili in base alla tua ricerca di vettori. Poi, li confronta 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 trova prima un ampio insieme di film simili alla tua ricerca e poi li filtra in base al genere, poiché la maggior parte dei film potrebbe essere drammatica.

Questa strategia è efficiente quando prevedi che molti risultati corrispondano al tuo filtro.

Filtro in linea

Il filtro in linea è una strategia di ottimizzazione delle query in cui AlloyDB utilizza sia gli indici di vettori sia altri indici secondari per eseguire in tandem la ricerca di vettori e la valutazione dei filtri. AlloyDB esegue ricerche nell'indice dei vettori 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 valutazione rapida di queste condizioni.

Ad esempio, se cerchi scarpe simili e filtri per color = black, il filtro in linea significa che AlloyDB controlla solo la somiglianza delle scarpe già nere. Questo è più efficiente rispetto al controllo della somiglianza di tutte le scarpe e al successivo filtro per colore o al filtro di tutte le scarpe per colore e al successivo controllo della 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 della procedura di esecuzione della query e mostra quale strategia di filtro viene scelta da AlloyDB per l'operazione di scansione vettoriale nel campo Strategia di esecuzione.

Un piano di query per il filtro in linea

Per i filtri in linea, AlloyDB 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 il 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 in linea per una ricerca di shoes filtrata per 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 di vettori ottimizzata mediante il filtro 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) indica che la query ha utilizzato la clausola SQL LIMIT 10; per limitare l'output. actual rows=10 indica 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 ricerca personalizzata perché è una ricerca speciale per i dati vettoriali e opera sulla tabella products. Il piano di query di esempio per il filtro in linea 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 una lista 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 del vettore, calcolata utilizzando l'espressione (embedding <=> '[...]')::vector, dove embedding fa riferimento alla colonna del vettore, <=> rappresenta l'operatore del vicino più vicino, [...] è il vettore di query e ::vector esegue il casting del tipo al tipo di dati del vettore.

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 corrispondenti alla condizione del filtro utilizzando un bitmap e utilizza color_index per il filtro.

L'attributo Index Cond: (color = 'black') specifica la condizione di filtro utilizzata dalla scansione dell'indice color = 'black' dalla clausola WHERE della query.

Passaggi successivi