Une recherche vectorielle filtrée se compose d'un vecteur de requête et d'un filtre pour un champ spécifique. AlloyDB Omni utilise les riches fonctionnalités de requête de PostgreSQL, ce qui vous permet d'effectuer une recherche vectorielle et d'interroger des données structurées et non structurées à partir d'une seule interface SQL.
Options de filtrage
L'optimiseur de requêtes AlloyDB Omni joue un rôle essentiel dans la détermination de la stratégie de filtrage la plus efficace pour votre recherche vectorielle.
Pour estimer le coût des différents plans d'exécution, l'optimiseur de requêtes analyse votre requête et prend en compte des facteurs tels que la sélectivité des filtres, la distribution des données et la disponibilité des index.
En fonction de l'estimation des coûts, l'optimiseur choisit une stratégie de filtrage optimale parmi les suivantes :
Pré-filtrage
Le pré-filtrage est une stratégie d'optimisation des requêtes dans laquelle AlloyDB Omni utilise vos filtres pour trouver un plus petit groupe d'éléments correspondant à vos critères au lieu de rechercher dans l'ensemble du jeu de données. AlloyDB Omni exécute ensuite la recherche vectorielle sur ce groupe plus petit.
Par exemple, si vous recherchez des chemises bleues similaires, AlloyDB Omni trouve d'abord toutes les chemises bleues, puis recherche des articles similaires dans ce groupe.
Cette stratégie améliore les performances, car elle exécute la recherche de similarité vectorielle, qui nécessite beaucoup de calculs, sur un jeu de données réduit.
Post-filtrage
Le post-filtrage est une stratégie qu'AlloyDB Omni utilise lorsque vos filtres ne réduisent pas considérablement les résultats. Au lieu de filtrer en premier, AlloyDB Omni commence par trouver une liste étendue d'éléments similaires en fonction de votre recherche vectorielle. Il vérifie ensuite les résultats par rapport aux conditions de votre filtre pour générer la liste finale.
Par exemple, si vous recherchez des films similaires et que vous disposez d'un filtre très large tel que genre = drama, AlloyDB Omni trouve d'abord un grand nombre de films similaires à votre recherche, puis les filtre par genre, car la plupart des films peuvent être des drames.
Cette stratégie est efficace lorsque vous vous attendez à ce que de nombreux résultats correspondent à votre filtre.
Filtrage en ligne
Le filtrage en ligne est une stratégie d'optimisation des requêtes dans laquelle AlloyDB Omni utilise à la fois des index vectoriels et d'autres index secondaires pour effectuer une recherche vectorielle et une évaluation des filtres en tandem. AlloyDB Omni effectue une recherche dans l'index vectoriel pour trouver des vecteurs similaires et vérifie également si chaque vecteur correspond aux conditions de votre filtre de métadonnées, en tirant parti d'index tels que les arbres B, GIN ou GiST pour une évaluation rapide de ces conditions.
Par exemple, si vous recherchez des chaussures similaires et que vous filtrez par color = black, le filtrage en ligne signifie qu'AlloyDB Omni ne vérifie que la similarité des chaussures déjà noires. Cette méthode est plus efficace que de vérifier la similarité de toutes les chaussures, puis de filtrer par couleur, ou de filtrer toutes les chaussures par couleur, puis de vérifier la similarité.
Le filtrage en ligne est particulièrement efficace lorsque les filtres réduisent les résultats de manière modérée.
Comprendre les plans de requête
Un plan de requête fournit une vue complète du processus d'exécution des requêtes et indique la stratégie de filtrage choisie par AlloyDB Omni pour l'opération d'analyse vectorielle dans le champ Stratégie d'exécution.
Plan de requête pour le filtrage en ligne
Pour le filtrage en ligne, AlloyDB Omni utilise un nœud de plan d'analyse personnalisé, également appelé analyse vectorielle, qui s'appuie sur un nœud de plan d'analyse d'index bitmap pour fournir le bitmap des clauses de filtre.
L'analyse vectorielle ne calcule les distances que pour les lignes qui répondent aux critères de filtre.
La requête suivante illustre le filtrage en ligne pour une recherche de shoes filtrée par color = black.
EXPLAIN
SELECT *
FROM products
WHERE color = 'black'
ORDER BY embedding <=> embedding('text-embedding-005', 'shoes')::vector
LIMIT 10;
L'exemple de plan de requête suivant illustre une recherche vectorielle optimisée à l'aide du filtrage en ligne :
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')
Dans l'exemple de plan de requête, Limit (actual rows=10) indique que la requête a utilisé la clause SQL LIMIT 10; pour limiter la sortie. actual rows=10 signifie que ce nœud a renvoyé 10 lignes lors de l'exécution de la requête.
Le nœud -> Custom Scan (vector scan) on products représente une opération de recherche vectorielle. Il s'agit d'une analyse personnalisée, car il s'agit d'une analyse spéciale pour les données vectorielles, et elle fonctionne sur la table products.
L'exemple de plan de requête pour le filtrage en ligne affiche Bitmap assisted vector Scan on products_embedding_index dans le champ Stratégie d'exécution. Cela indique que l'analyse vectorielle utilise le bitmap pour créer une liste restreinte de lignes sur lesquelles une recherche de similarité doit être effectuée. L'analyse d'index bitmap est utilisée pour filtrer les données en fonction de la condition color = 'black'.
L'attribut Order By: (embedding <=> '[...]')::vector indique que les résultats sont triés en fonction de la similarité vectorielle, calculée à l'aide de l'expression (embedding <=> '[...]')::vector, où embedding fait référence à la colonne vectorielle, <=> représente l'opérateur de voisin le plus proche, [...] est le vecteur de requête et ::vector effectue un cast de type vers le type de données vectorielles.
Le nœud -> Bitmap Index Scan on products (color_index) représente une analyse d'index bitmap sur colors_index. Une analyse d'index bitmap sélectionne les lignes correspondant à la condition de filtre à l'aide d'un bitmap et utilise color_index pour le filtrage.
L'attribut Index Cond: (color = 'black') spécifie la condition de filtre utilisée par l'analyse d'index color = 'black' à partir de la clause WHERE de la requête.