En esta página, se proporciona una descripción general de la búsqueda vectorial filtrada en AlloyDB para PostgreSQL.
Una búsqueda vectorial filtrada consta de un vector de consulta y un filtro para un campo específico. AlloyDB usa las capacidades de consulta enriquecidas de PostgreSQL, lo que te permite realizar búsquedas vectoriales y consultar datos estructurados y no estructurados desde una sola interfaz de SQL.
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 búsqueda de vectores.
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.
En función de la estimación de costos, el optimizador elige una estrategia de filtrado óptima entre las siguientes:
Prefiltrado
El filtrado previo 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 artículos similares dentro de ese grupo.
Esta estrategia mejora el rendimiento porque ejecuta la búsqueda de similitud de vectores intensiva en procesamiento en un conjunto de datos reducido.
Posfiltrado
El filtrado posterior es una estrategia que AlloyDB usa cuando tus filtros no limitan los resultados de forma 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 en función de 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 gran conjunto 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 índices vectoriales y otros secundarios para realizar la búsqueda vectorial 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 tus condiciones de filtro de metadatos, aprovechando índices como B-árboles, GIN o GiST para una 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 forma moderada.
Comprende los planes de consultas
Un plan de consulta 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 vectorial en el campo Estrategia de ejecución.
Un plan de consulta para el filtrado intercalado
Para el filtrado intercalado, AlloyDB usa un nodo de plan de escaneo personalizado, también conocido como escaneo vectorial, que se basa en un nodo de plan de escaneo de índice de mapa de bits para proporcionar el mapa de bits de las cláusulas de filtro.
El análisis vectorial calcula las distancias solo para las filas que satisfacen los criterios del 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 ejemplo de plan de consulta, se ilustra una búsqueda vectorial optimizada con 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 consulta de ejemplo, Limit (actual rows=10)
muestra que la consulta usó la cláusula LIMIT 10;
de SQL 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 vectorial. Es un análisis personalizado porque es un análisis especial para datos vectoriales y funciona en la tabla products
.
El plan de consulta de ejemplo para el filtrado intercalado muestra Bitmap assisted vector Scan on products_embedding_index
en el campo Estrategia de ejecución, lo que indica que el análisis vectorial usa el mapa de bits para crear una lista corta 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 en función de la similitud vectorial, que se calcula con la expresión (embedding <=> '[...]')::vector
, en la que embedding
hace referencia a la columna vectorial, <=>
representa al operador de vecino más cercano, [...]
es el vector de consulta y ::vector
realiza el tipo de asignación al tipo de datos vectorial.
El nodo -> Bitmap Index Scan on products (color_index)
representa un análisis de índice de mapa de bits en colors_index
. Un análisis de índice de mapa de bits selecciona filas que coinciden con la condición del filtro mediante un mapa de bits y usa color_index
para filtrar.
El atributo Index Cond: (color = 'black')
especifica la condición de filtro que usa el análisis del índice color = 'black'
de la cláusula WHERE
de la consulta.