Visão geral da pesquisa vetorial filtrada no AlloyDB Omni

Selecione uma versão da documentação:

Nesta página, oferecemos uma visão geral da pesquisa vetorial filtrada no AlloyDB Omni.

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 o desempenho 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 usada pelo AlloyDB Omni quando os 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 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 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ções de filtros em conjunto. O AlloyDB Omni 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 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 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 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.

A seguir