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

A seguir