Cette page présente la recherche vectorielle filtrée dans AlloyDB pour PostgreSQL.
Une recherche vectorielle filtrée se compose d'un vecteur de requête et d'un filtre pour un champ spécifique. AlloyDB utilise les puissantes fonctionnalités de requête de PostgreSQL, ce qui vous permet d'effectuer des recherches vectorielles et d'interroger à la fois des données structurées et non structurées à partir d'une seule interface SQL.
Options de filtrage
L'optimiseur de requêtes AlloyDB joue un rôle crucial 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.
Sur la base 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 qui permet à AlloyDB d'utiliser vos filtres pour trouver un groupe plus restreint d'éléments correspondant à vos critères au lieu de rechercher dans l'ensemble de données. AlloyDB exécute ensuite la recherche vectorielle sur ce groupe plus petit.
Par exemple, si vous recherchez des chemises bleues similaires, AlloyDB recherche d'abord toutes les chemises bleues, puis les articles similaires de 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 ensemble de données réduit.
Post-filtrage
Le post-filtrage est une stratégie utilisée par AlloyDB lorsque vos filtres n'affinent pas considérablement les résultats. Au lieu de filtrer d'abord, AlloyDB commence par trouver une liste large d'éléments similaires en fonction de votre recherche vectorielle. Il compare ensuite les résultats aux conditions de filtrage pour générer la liste finale.
Par exemple, si vous recherchez des films similaires et que vous utilisez un filtre très large comme genre = drama
, AlloyDB trouve d'abord un grand ensemble 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 à de nombreux résultats correspondant à votre filtre.
Filtrage intégré
Le filtrage intégré est une stratégie d'optimisation des requêtes dans laquelle AlloyDB utilise à la fois des vecteurs et d'autres index secondaires pour effectuer une recherche vectorielle et une évaluation des filtres en tandem. AlloyDB recherche dans l'index vectoriel des vecteurs similaires et vérifie également si chaque vecteur correspond à vos conditions de filtre de métadonnées, en utilisant des 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 intégré signifie qu'AlloyDB ne vérifie que la similarité des chaussures déjà noires. Cette approche 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 idéal lorsque les filtres affinent 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 de la requête et indique la stratégie de filtrage choisie par AlloyDB pour l'opération de balayage vectoriel dans le champ Stratégie d'exécution.
Plan de requête pour le filtrage intégré
Pour le filtrage intégré, AlloyDB 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 filtrage.
L'analyse vectorielle ne calcule les distances que pour les lignes qui répondent aux critères de filtrage.
La requête suivante illustre le filtrage intégré pour une recherche 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 intégré:
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 qu'elle fonctionne sur la table products
.
L'exemple de plan de requête pour le filtrage intégré affiche Bitmap assisted vector Scan on products_embedding_index
dans le champ Stratégie d'exécution, ce qui indique que l'analyse vectorielle utilise le bitmap pour créer une liste restreinte de lignes sur lesquelles la recherche de similarité doit être effectuée. L'analyse de l'index bitmap permet de 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 de vecteurs, <=>
représente l'opérateur de voisin le plus proche, [...]
est le vecteur de requête et ::vector
effectue le cast de type vers le type de données de vecteur.
Le nœud -> Bitmap Index Scan on products (color_index)
représente une analyse d'index bitmap sur le 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 filtrage utilisée par l'analyse de l'index color = 'black'
à partir de la clause WHERE
de la requête.