Esta página oferece uma visão geral da pesquisa vetorial filtrada no AlloyDB para PostgreSQL.
Uma pesquisa vetorial filtrada consiste em um vetor de consulta e um filtro para um campo específico. O AlloyDB usa os recursos avançados de consulta do PostgreSQL, permitindo que você realize pesquisas de vetores e consulte dados estruturados e não estruturados em uma única interface SQL.
Opções de filtragem
O otimizador de consultas do AlloyDB 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 do 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 opções:
Pré-filtragem
A pré-filtragem é uma estratégia de otimização de consulta em que o AlloyDB 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 executa a pesquisa vetorial nesse grupo menor.
Por exemplo, se você estiver procurando camisas azuis semelhantes, o AlloyDB primeiro encontra todas as camisas azuis e depois procura itens semelhantes dentro desse grupo.
Essa estratégia melhora a performance porque executa a pesquisa de similaridade de vetores com uso intensivo de computação em um conjunto de dados reduzido.
Pós-filtragem
A pós-filtragem é uma estratégia que o AlloyDB usa quando seus filtros não restringem os resultados de forma considerável. Em vez de filtrar primeiro, o AlloyDB começa encontrando uma lista ampla de itens semelhantes com base na pesquisa vetorial. Em seguida, ele verifica os resultados com base nas condições do filtro para gerar a lista final.
Por exemplo, se você pesquisar filmes semelhantes e tiver um filtro muito amplo, como genre = drama
, o AlloyDB primeiro encontra um grande conjunto de filmes semelhantes à sua pesquisa e, em seguida, os filtra 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 filtro.
Filtragem inline
A filtragem inline é uma estratégia de otimização de consulta em que o AlloyDB usa vetores e outros índices secundários para realizar a pesquisa vetorial e a avaliação do filtro em conjunto. O AlloyDB pesquisa no índice de vetores para encontrar vetores semelhantes e também verifica se cada vetor corresponde às condições do filtro de metadados, usando índices como B-trees, GIN ou GiST para uma 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 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 moderadamente.
Entender os planos de consulta
Um plano de consulta fornece uma visão abrangente do processo de execução da consulta e mostra qual estratégia de filtragem o AlloyDB 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 usa um nó de plano de verificação personalizado, também conhecido como verificação de vetor, 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 shoes
filtrada por color = black
.
EXPLAIN
SELECT *
FROM products
WHERE color = 'black'
ORDER BY embedding <=> embedding('text-embedding-005', 'shoes')::vector
LIMIT 10;
O exemplo de plano de consulta a seguir ilustra uma pesquisa de vetor otimizada usando a 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 vetoriais e opera na tabela products
.
O plano de consulta de exemplo para a 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 vetorial usa o bitmap para criar uma lista curta 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 semelhança do vetor, calculada usando a expressão (embedding <=> '[...]')::vector
, em que embedding
se refere à coluna do vetor, <=>
representa o operador de vizinho mais próximo, [...]
é o vetor de consulta e ::vector
realiza a atribuição de tipo para o tipo de dados do vetor.
O nó -> Bitmap Index Scan on products (color_index)
representa uma verificação de índice de bitmap no colors_index
. Uma verificação de índice de bitmap seleciona linhas que correspondem à condição de filtro usando um bitmap e usa color_index
para filtrar.
O atributo Index Cond: (color = 'black')
especifica a condição de filtro usada pelo exame de índice color = 'black'
da cláusula WHERE
da consulta.