Una búsqueda de vectores filtrada consta de un vector de búsqueda y un filtro para un campo específico. AlloyDB Omni usa las potentes capacidades de consulta de PostgreSQL, lo que te permite realizar búsquedas de vectores y consultar datos estructurados y no estructurados desde una sola interfaz de SQL.
Opciones de filtros
El optimizador de consultas de AlloyDB Omni 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 los 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 Omni 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 Omni ejecuta la búsqueda de vectores en ese grupo más pequeño.
Por ejemplo, si buscas camisas azules similares, AlloyDB Omni 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 que requiere una gran cantidad de procesamiento en un conjunto de datos reducido.
Después del filtrado
El posfiltrado es una estrategia que AlloyDB Omni usa cuando los filtros no reducen los resultados de forma considerable. En lugar de filtrar primero, AlloyDB Omni comienza por encontrar una lista amplia de elementos similares según tu búsqueda de vectores. Luego, verifica 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 Omni primero encuentra un gran conjunto de películas similares a tu búsqueda y, luego, las filtra por género, ya que la mayoría de las películas podrían 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 Omni usa tanto índices vectoriales como otros índices secundarios para realizar la búsqueda de vectores y la evaluación de filtros en tándem. AlloyDB Omni busca en el índice de vectores para encontrar vectores similares y también verifica si cada vector coincide con las condiciones de tu filtro de metadatos, aprovechando índices como los árboles B, 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 Omni 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, filtrarlos 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 Omni para la operación de análisis de vectores en el campo Estrategia de ejecución.
Plan de consulta para el filtrado intercalado
Para el filtrado intercalado, AlloyDB Omni 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 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;
El siguiente plan de consulta de ejemplo ilustra una búsqueda de vectores 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 consultas 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 devolvió 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 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 Estrategia de ejecución, lo que indica que el análisis de vectores usa el mapa de bits para crear una lista abreviada de filas en las que se debe realizar la búsqueda de similitud. El análisis del í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 los 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 búsqueda y ::vector realiza la conversión de tipos 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 el colors_index. Un análisis de índice de mapa de bits selecciona las filas que coinciden con la condición del filtro usando un mapa de bits y usa color_index para el filtrado.
El atributo Index Cond: (color = 'black') especifica la condición de filtro que utiliza el análisis del índice color = 'black' de la cláusula WHERE de la consulta.