En esta página se ofrece una descripción general de la búsqueda vectorial filtrada en AlloyDB para PostgreSQL.
Una búsqueda de vectores filtrada consta de un vector de consulta y un filtro para un campo específico. AlloyDB usa las completas funciones de consulta de PostgreSQL, lo que te permite realizar búsquedas vectoriales y consultar datos estructurados y no estructurados desde una única interfaz SQL.
Opciones de filtrado
El optimizador de consultas de AlloyDB desempeña un papel fundamental a la hora de determinar la estrategia de filtrado más eficiente para tu búsqueda de vectores.
Para estimar el coste de los diferentes planes de ejecución, el optimizador de consultas analiza su consulta y tiene en cuenta factores como la selectividad de los filtros, la distribución de los datos y la disponibilidad de los índices.
En función de la estimación de costes, el optimizador elige una estrategia de filtrado óptima entre las siguientes:
Prefiltro
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. A continuación, AlloyDB ejecuta la búsqueda de vectores en ese grupo más pequeño.
Por ejemplo, si buscas camisas azules similares, AlloyDB primero encontrará todas las camisas azules y, después, buscará artículos similares dentro de ese grupo.
Esta estrategia mejora el rendimiento porque ejecuta la búsqueda de similitud de vectores, que requiere muchos recursos computacionales, en un conjunto de datos reducido.
Postfiltrado
El postfiltrado es una estrategia que usa AlloyDB cuando los filtros no acotan los resultados de forma considerable. En lugar de filtrar primero, AlloyDB empieza por buscar una lista amplia de elementos similares en función de tu búsqueda de vectores. Después, compara los resultados con las condiciones de tu 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 similares a tu búsqueda y, a continuación, las filtra por género, ya que la mayoría de las películas pueden ser dramas.
Esta estrategia es eficaz cuando esperas que muchos resultados coincidan con tu filtro.
Filtrado entre líneas
El filtrado insertado es una estrategia de optimización de consultas en la que AlloyDB usa tanto índices vectoriales como otros índices secundarios para realizar búsquedas vectoriales y evaluaciones de filtros de forma conjunta. AlloyDB busca en el índice de vectores para encontrar vectores similares y también comprueba si cada vector cumple las condiciones de tu filtro de metadatos. Para ello, utiliza índices como B-trees, GIN o GiST para evaluar rápidamente estas condiciones.
Por ejemplo, si buscas zapatos similares y filtras por color = black
, el filtrado insertado significa que AlloyDB solo comprueba la similitud de los zapatos que ya son negros. Es más eficiente que comprobar la similitud de todos los zapatos y, a continuación, filtrar por color, o filtrar todos los zapatos por color y, a continuación, comprobar la similitud.
El filtrado insertado es muy útil cuando los filtros acotan los resultados de forma moderada.
Información sobre los planes de consultas
Un plan de consulta proporciona una vista completa 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 insertado
Para el filtrado insertado, AlloyDB usa un nodo de plan de análisis personalizado, también conocido como análisis vectorial, que se basa en un nodo de plan de análisis 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 de las filas que cumplen los criterios del filtro.
La siguiente consulta muestra el filtrado insertado de 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;
El siguiente plan de consulta de ejemplo muestra una búsqueda vectorial optimizada con filtrado insertado:
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 ha usado la cláusula LIMIT 10;
de SQL para restringir el resultado. actual rows=10
significa que este nodo ha devuelto 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. Se trata de un análisis personalizado porque es un análisis especial para datos vectoriales y se realiza en la tabla products
.
El plan de consulta de ejemplo para el filtrado insertado muestra Bitmap assisted vector Scan on products_embedding_index
en el campo Estrategia de ejecución, lo que indica que la búsqueda vectorial 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 en función de 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 mediante la expresión (embedding <=> '[...]')::vector
, donde embedding
hace referencia a la columna de vector, <=>
representa el operador de vecino más próximo, [...]
es el vector de consulta y ::vector
realiza la conversión de tipo al tipo de datos de vector.
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 las filas que coinciden con la condición del filtro mediante un mapa de bits y usa el color_index
para filtrar.
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.