Visão geral da pesquisa vetorial filtrada no AlloyDB Omni

Selecione uma versão da documentação:

Esta página oferece 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 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 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 correspondam 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 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 Omni usa quando seus filtros não restringem os resultados consideravelmente. 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 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 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 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 Omni 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 é excelente 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 Omni 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 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 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.

A seguir