Uma pesquisa vetorial filtrada consiste em um vetor de consulta e um filtro para um campo específico. O AlloyDB Omni usa os recursos avançados de consulta do PostgreSQL, permitindo que você faça pesquisas vetoriais e consulte dados estruturados e não estruturados em uma única interface SQL.
Opções de filtragem
O otimizador de consultas do AlloyDB Omni desempenha um papel crucial na determinação da estratégia de filtragem mais eficiente para sua pesquisa vetorial.
Para estimar o custo de diferentes planos de execução, o otimizador de consultas analisa sua consulta e considera fatores como seletividade de filtro, distribuição de dados e disponibilidade de índice.
Com base na estimativa de custo, o otimizador escolhe uma estratégia de filtragem ideal entre as seguintes:
Pré-filtragem
A pré-filtragem é uma estratégia de otimização de consultas em que o AlloyDB Omni usa seus filtros para encontrar um grupo menor de itens que correspondem aos seus critérios, em vez de pesquisar em todo o conjunto de dados. Em seguida, o AlloyDB Omni executa a pesquisa vetorial nesse grupo menor.
Por exemplo, se você estiver procurando camisas azuis semelhantes, o AlloyDB Omni primeiro vai encontrar todas as camisas azuis e depois pesquisar itens semelhantes nesse grupo.
Essa estratégia melhora a performance porque executa a pesquisa de similaridade de vetores que exige muita computação em um conjunto de dados reduzido.
Pós-filtragem
A pós-filtragem é uma estratégia usada pelo AlloyDB Omni quando seus filtros não restringem muito os resultados. Em vez de filtrar primeiro, o AlloyDB Omni começa encontrando uma lista ampla de itens semelhantes com base na sua pesquisa vetorial. Em seguida, ele verifica os resultados em relação às condições de filtro para gerar a lista final.
Por exemplo, se você pesquisar filmes semelhantes e tiver um filtro muito amplo, como genre = drama, o AlloyDB Omni primeiro vai encontrar um grande conjunto de filmes semelhantes à sua pesquisa e depois vai filtrá-los por gênero, já que a maioria dos filmes pode ser de drama.
Essa estratégia é eficiente quando você espera que muitos resultados correspondam ao seu filtro.
Filtragem inline
A filtragem inline é uma estratégia de otimização de consultas em que o AlloyDB Omni usa vetores e outros índices secundários para realizar pesquisas vetoriais e avaliação de filtros em conjunto. O AlloyDB Omni pesquisa no índice vetorial para encontrar vetores semelhantes e também verifica se cada vetor corresponde às condições de filtro de metadados, aproveitando índices como B-trees, GIN ou GiST para avaliação rápida dessas condições.
Por exemplo, se você pesquisar sapatos semelhantes e filtrar por color = black, a filtragem inline significa que o AlloyDB Omni só vai verificar a semelhança de sapatos que já são pretos. Isso é mais eficiente do que verificar a semelhança de todos os sapatos e depois filtrar por cor ou filtrar todos os sapatos por cor e depois verificar a semelhança.
A filtragem inline é excelente quando os filtros restringem os resultados de forma moderada.
Entender planos de consulta
Um plano de consulta oferece uma visão abrangente do processo de execução da consulta e mostra qual estratégia de filtragem o AlloyDB Omni escolhe para a operação de verificação de vetor no campo Estratégia de execução.
Um plano de consulta para filtragem inline
Para a filtragem inline, o AlloyDB Omni usa um nó de plano de verificação personalizada, também conhecido como verificação vetorial, que depende de um nó de plano de verificação de índice de bitmap para fornecer o bitmap para as cláusulas de filtro.
A verificação de vetor calcula distâncias apenas para linhas que atendem aos critérios de filtro.
A consulta a seguir demonstra a filtragem inline para uma pesquisa de shoes filtrada por color = black.
EXPLAIN
SELECT *
FROM products
WHERE color = 'black'
ORDER BY embedding <=> embedding('text-embedding-005', 'shoes')::vector
LIMIT 10;
O plano de consulta de exemplo a seguir ilustra uma pesquisa vetorial otimizada usando filtragem inline:
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')
No plano de consulta de exemplo, Limit (actual rows=10) mostra que a consulta usou a cláusula SQL LIMIT 10; para restringir a saída. actual rows=10 significa que esse nó retornou 10 linhas durante a execução da consulta.
O nó -> Custom Scan (vector scan) on products representa uma operação de pesquisa vetorial. É uma verificação personalizada porque é uma verificação especial para dados de vetor e opera na tabela products.
O plano de consulta de exemplo para filtragem inline mostra Bitmap assisted vector Scan on products_embedding_index no campo Estratégia de execução, o que indica que a verificação de vetor usa o bitmap para criar uma lista abreviada de linhas em que a pesquisa de similaridade precisa ser realizada. A verificação de índice de bitmap é usada para filtrar os dados com base na condição color = 'black'.
O atributo Order By: (embedding <=> '[...]')::vector indica que os resultados são ordenados com base na similaridade de vetores, calculada usando a expressão (embedding <=> '[...]')::vector, em que embedding se refere à coluna de vetor, <=> representa o operador de vizinho mais próximo, [...] é o vetor de consulta e ::vector realiza a conversão de tipo para o tipo de dados de vetor.
O nó -> Bitmap Index Scan on products (color_index) representa uma verificação de índice de bitmap em colors_index. Uma verificação de índice de bitmap seleciona linhas que correspondem à condição de filtro usando um bitmap e usa o color_index para filtragem.
O atributo Index Cond: (color = 'black') especifica a condição de filtro usada pela verificação de índice color = 'black' da cláusula WHERE da consulta.