Visão geral da pesquisa vetorial filtrada no AlloyDB

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 de consulta avançados do PostgreSQL, permitindo que você realize 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 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 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 encontrará todas as camisas azuis e, em seguida, pesquisará itens semelhantes nesse grupo.

Essa estratégia melhora a performance porque executa a pesquisa de similaridade vetorial computacionalmente intensiva 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 consideravelmente. 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 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 primeiro encontrará um grande conjunto de filmes semelhantes à sua pesquisa e, em seguida, os filtrará por gênero, já que a maioria dos filmes pode ser dramas.

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 consultas em que o AlloyDB usa vetores e outros índices secundários para realizar pesquisas vetoriais e avaliações de filtros em conjunto. O AlloyDB pesquisa o í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 só verifica a similaridade de sapatos que já são pretos. Isso é mais eficiente do que verificar a similaridade de todos os sapatos e, em seguida, filtrar por cor ou filtrar todos os sapatos por cor e, em seguida, verificar a similaridade.

A filtragem inline se destaca quando os filtros restringem os resultados moderadamente.

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 escolhe para a operação de verificação vetorial 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 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 vetorial 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 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 filtragem inline mostra Bitmap assisted vector Scan on products_embedding_index no campo Estratégia de execução, que indica que a verificação vetorial usa o bitmap para criar uma lista 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 vetorial, calculada usando a expressão (embedding <=> '[...]')::vector, em que embedding se refere à coluna vetorial, <=> 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 vetorial.

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 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.

Práticas recomendadas para pesquisa vetorial filtrada

Se as consultas de pesquisa vetorial incluírem filtros, recomendamos criar um índice B-tree nas colunas usadas nesses filtros, independentemente de você usar um índice vetorial ScaNN, HNSW ou IVFFlat.

A seguir