Panoramica della ricerca di vettori filtrati in AlloyDB Omni

Seleziona una versione della documentazione:

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

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 ricerche vettoriali 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é eseguire ricerche 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 in modo significativo 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 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 la valutazione rapida di queste condizioni.

Ad esempio, se cerchi scarpe simili e filtri in base a color = black, il filtro 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 filtro per colore o al filtro di tutte le scarpe per colore e poi al controllo della similarità.

Il filtro in linea è particolarmente efficace 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 filtro in linea

Per il filtro 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 filtro 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 che utilizza 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) 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 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 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'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 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