Pesquisa vetorial filtrada na vista geral do AlloyDB Omni

Selecione uma versão da documentação:

Esta página apresenta uma vista geral da pesquisa vetorial filtrada no AlloyDB Omni.

Uma pesquisa vetorial filtrada consiste num vetor de consulta e num filtro para um campo específico. O AlloyDB Omni usa as capacidades de consulta avançadas do PostgreSQL, o que lhe permite realizar pesquisas vetoriais e consultar dados estruturados e não estruturados a partir de 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 a sua pesquisa vetorial.

Para estimar o custo de diferentes planos de execução, o otimizador de consultas analisa a sua consulta e considera fatores como a seletividade dos filtros, a distribuição de dados e a disponibilidade de índices.

Com base na estimativa de custos, 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 os seus filtros para encontrar um grupo mais pequeno de itens que correspondem aos seus critérios, em vez de pesquisar no conjunto de dados completo. Em seguida, o AlloyDB Omni executa a pesquisa vetorial nesse grupo mais pequeno.

Por exemplo, se estiver à procura de camisas azuis semelhantes, o AlloyDB Omni encontra primeiro todas as camisas azuis e, em seguida, procura artigos semelhantes nesse grupo.

Esta estratégia melhora o desempenho porque executa a pesquisa de semelhança vetorial computacionalmente intensiva num conjunto de dados reduzido.

Pós-filtragem

A filtragem posterior é uma estratégia que o AlloyDB Omni usa quando os seus filtros não restringem os resultados de forma considerável. Em vez de filtrar primeiro, o AlloyDB Omni começa por encontrar uma lista ampla de itens semelhantes com base na sua pesquisa vetorial. Em seguida, verifica os resultados em função das condições do filtro para gerar a lista final.

Por exemplo, se pesquisar filmes semelhantes e tiver um filtro muito abrangente, como genre = drama, o AlloyDB Omni encontra primeiro um grande conjunto de filmes semelhantes à sua pesquisa e, em seguida, filtra-os por género, uma vez que a maioria dos filmes pode ser de drama.

Esta estratégia é eficiente quando 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 índices vetoriais e outros secundários para realizar a pesquisa vetorial e a avaliação 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, tirando partido de índices como B-trees, GIN ou GiST para uma avaliação rápida destas condições.

Por exemplo, se pesquisar sapatos semelhantes e filtrar por color = black, a filtragem inline significa que o AlloyDB Omni só verifica a semelhança dos sapatos que já são pretos. Isto é mais eficiente do que verificar a semelhança de todos os sapatos e, em seguida, filtrar por cor, ou filtrar todos os sapatos por cor e, em seguida, verificar a semelhança.

A filtragem inline é excelente quando os filtros restringem os resultados de forma moderada.

Compreenda os planos de consulta

Um plano de consulta oferece uma vista abrangente do processo de execução de consultas e mostra que estratégia de filtragem o AlloyDB Omni escolhe para a operação de análise 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ó do plano de análise personalizado, também conhecido como análise de vetores, que se baseia num nó do plano de análise de índice de mapa de bits para fornecer o mapa de bits para as cláusulas de filtro.

A análise vetorial calcula as distâncias apenas para as linhas que cumprem os critérios de filtro.

A consulta seguinte 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 seguinte ilustra uma pesquisa vetorial otimizada com 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 o resultado. actual rows=10 significa que este nó devolveu 10 linhas durante a execução da consulta.

O nó -> Custom Scan (vector scan) on products representa uma operação de pesquisa vetorial. É uma análise personalizada porque é uma análise 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 análise vetorial usa o mapa de bits para criar uma lista restrita de linhas nas quais a pesquisa de semelhanças tem de ser realizada. A análise do índice de mapa de bits é 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 vetorial, calculada através da 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 análise de índice de mapa de bits no colors_index. Uma análise de índice de mapa de bits seleciona linhas que correspondem à condição de filtro através de um mapa de bits e usa o color_index para filtragem.

O atributo Index Cond: (color = 'black') especifica a condição de filtro usada pela análise do índice color = 'black' da cláusula WHERE da consulta.

O que se segue?