La búsqueda de Vector Search filtrada en AlloyDB para PostgreSQL te permite combinar la búsqueda de similitud de vectores con filtros SQL estructurados en una sola consulta. Si vinculas un vector de consulta con predicados de metadatos, puedes limitar los resultados de similitud a subconjuntos coincidentes de tus datos mientras el optimizador de consultas de AlloyDB selecciona automáticamente la estrategia de filtrado más eficiente.
Opciones de filtros
El optimizador de consultas de AlloyDB desempeña un papel fundamental en la determinación de la estrategia de filtrado más eficiente para tu Vector Search.
Para estimar el costo de los diferentes planes de ejecución, el optimizador de consultas analiza tu consulta y considera factores como la selectividad del filtro, la distribución de datos y la disponibilidad del índice.
Según la estimación de costos, el optimizador elige una estrategia de filtrado óptima entre las siguientes:
Prefiltrado
El prefiltrado es una estrategia de optimización de consultas en la que AlloyDB usa tus filtros para encontrar un grupo más pequeño de elementos que coincidan con tus criterios en lugar de buscar en todo el conjunto de datos. Luego, AlloyDB ejecuta la búsqueda de vectores en ese grupo más pequeño.
Por ejemplo, si buscas camisas azules similares, AlloyDB primero encuentra todas las camisas azules y, luego, busca elementos similares dentro de ese grupo.
Esta estrategia mejora el rendimiento porque ejecuta la búsqueda de similitud de vectores que requiere mucha capacidad de procesamiento en un conjunto de datos reducido.
Filtrado posterior
El filtrado posterior es una estrategia que usa AlloyDB cuando tus filtros no limitan los resultados de manera considerable. En lugar de filtrar primero, AlloyDB comienza por encontrar una lista amplia de elementos similares según tu búsqueda de vectores. Luego, verifica los resultados con tus condiciones de filtro para generar la lista final.
Por ejemplo, si buscas películas similares y tienes un filtro muy amplio como genre = drama, AlloyDB primero encuentra un conjunto grande de películas que son similares a tu búsqueda y, luego, las filtra por género, ya que la mayoría de las películas pueden ser dramas.
Esta estrategia es eficiente cuando esperas que muchos resultados coincidan con tu filtro.
Filtrado intercalado
El filtrado intercalado es una estrategia de optimización de consultas en la que AlloyDB usa vectores y otros índices secundarios para realizar la búsqueda de vectores y la evaluación de filtros en conjunto. AlloyDB busca en el índice de vectores para encontrar vectores similares y también verifica si cada vector coincide con las condiciones de filtro de metadatos, aprovechando índices como B-trees, GIN o GiST para la evaluación rápida de estas condiciones.
Por ejemplo, si buscas zapatos similares y filtras por color = black, el filtrado intercalado significa que AlloyDB solo verifica la similitud de los zapatos que ya son negros. Esto es más eficiente que verificar la similitud de todos los zapatos y, luego, filtrar por color, o filtrar todos los zapatos por color y, luego, verificar la similitud.
El filtrado intercalado es excelente cuando los filtros limitan los resultados de manera moderada.
Comprende los planes de consultas
Un plan de consultas proporciona una vista integral del proceso de ejecución de la consulta y muestra qué estrategia de filtrado elige AlloyDB para la operación de análisis de vectores en el campo Execution Strategy.
Un plan de consultas para el filtrado intercalado
Para el filtrado intercalado, AlloyDB usa un nodo de plan de análisis personalizado, también conocido como análisis de vectores, que se basa en un nodo de plan de análisis de índice de mapa de bits para proporcionar el mapa de bits para las cláusulas de filtro.
El análisis de vectores calcula las distancias solo para las filas que cumplen con los criterios de filtro.
En la siguiente consulta, se muestra el filtrado intercalado para una búsqueda de shoes filtrada por color = black.
EXPLAIN
SELECT *
FROM products
WHERE color = 'black'
ORDER BY embedding <=> embedding('text-embedding-005', 'shoes')::vector
LIMIT 10;
En el siguiente plan de consultas de ejemplo, se ilustra una Vector Search optimizada con el filtrado intercalado:
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')
En el plan de consultas de ejemplo, Limit (actual rows=10) muestra que la consulta usó la cláusula SQL LIMIT 10; para restringir el resultado. actual rows=10 significa que este nodo mostró 10 filas durante la ejecución de la consulta.
El nodo -> Custom Scan (vector scan) on products representa una operación de búsqueda de vectores. Es un análisis personalizado porque es un análisis especial para datos vectoriales y opera en la tabla products.
El plan de consultas de ejemplo para el filtrado intercalado muestra Bitmap assisted vector Scan on products_embedding_index en el campo Execution Strategy, lo que indica que el análisis de vectores usa el mapa de bits para crear una lista breve de filas en las que se debe realizar la búsqueda de similitud. El análisis de índice de mapa de bits se usa para filtrar los datos según la condición color = 'black'.
El atributo Order By: (embedding <=> '[...]')::vector indica que los resultados se ordenan según la similitud de vectores, que se calcula con la expresión (embedding <=> '[...]')::vector, en la que embedding hace referencia a la columna de vectores, <=> representa el operador de vecino más cercano, [...] es el vector de consulta y ::vector realiza la conversión de tipos al tipo de datos vectoriales.
El nodo -> Bitmap Index Scan on products (color_index) representa un análisis de índice de mapa de bits en el colors_index. Un análisis de índice de mapa de bits selecciona las filas que coinciden con la condición de filtro con un mapa de bits y usa color_index para el filtrado.
El atributo Index Cond: (color = 'black') especifica la condición de filtro que usa el análisis de índice color = 'black' de la cláusula WHERE de la consulta.
Prácticas recomendadas para la búsqueda de vectores filtrada
Si tus consultas de búsqueda de vectores incluyen filtros, te recomendamos que crees un índice B-tree en las columnas que se usan en esos filtros, independientemente de si usas un índice de vectores ScaNN, HNSW o IVFFlat.