Todos os produtos
Search
Central de documentação

PolarDB:PGVector (recuperação de vetores)

Última atualização: Jul 04, 2026

O PGVector é uma extensão do PolarDB for PostgreSQL para armazenar e consultar embeddings vetoriais de alta dimensionalidade. Ele oferece suporte à indexação Hierarchical Navigable Small World (HNSW) e Inverted File Flat (IVFFlat) para busca aproximada de vizinhos mais próximos (ANN), com vetores de até 16.000 dimensões. Use o PGVector para criar sistemas de busca semântica, recomendação e outras aplicações de IA diretamente no seu cluster PolarDB.

Pré-requisitos

Antes de começar, verifique se o seu cluster executa uma das seguintes versões do mecanismo:

  • PostgreSQL 16, versão de revisão 2.0.16.3.1.1 ou posterior

  • PostgreSQL 15, versão de revisão 2.0.15.12.4.0 ou posterior

  • PostgreSQL 14, versão de revisão 2.0.14.7.9.0 ou posterior

  • PostgreSQL 11, versão de revisão 2.0.11.9.35.0 ou posterior

Para verificar a versão de revisão do seu cluster, execute SHOW polardb_version; ou consulte o console do PolarDB. Caso a versão não atenda aos requisitos, atualize a versão de revisão.

Diferentes versões do mecanismo suportam diferentes versões da extensão. Para consultar a matriz completa de compatibilidade, veja Extensões .

Limitações

  • A execução paralela entre nós suporta varreduras sequenciais com cláusula ORDER BY, mas não suporta varreduras de índice.

  • O PGVector aceita vetores com até 16.000 dimensões.

Como funciona

O PGVector fornece dois algoritmos de indexação para busca ANN:

O HNSW constrói uma estrutura de grafo multicamada. As consultas percorrem o grafo da camada superior para a inferior, restringindo progressivamente a busca. O HNSW oferece maior recall e desempenho de consulta mais rápido, porém exige mais memória e leva mais tempo para ser construído.

O IVFFlat é uma versão simplificada do algoritmo Inverted File System with Asymmetric Distance Computation (IVFADC). Ele utiliza clustering k-means para particionar vetores em grupos (listas invertidas), cada um com um centroide. O processo ocorre em três etapas:

  1. Atribua vetores a clusters usando k-means. Cada cluster possui um centroide.

  2. Encontre os centroides mais próximos do vetor de consulta, conforme definido por probes.

  3. Pesquise todos os vetores nesses clusters e retorne os k resultados mais próximos.

O IVFFlat constrói índices mais rapidamente e consome menos memória que o HNSW, mas entrega um recall menor. Seu uso de armazenamento é reduzido, sendo ideal para conjuntos de dados onde uma latência de consulta de até 100 milissegundos é aceitável.

Primeiros passos

As etapas a seguir apresentam um exemplo completo: ativar o PGVector, criar uma tabela e um índice vetorial e consultar vetores semelhantes.

  1. Ative a extensão PGVector.

    Se o seu cluster executar o PostgreSQL 17 e retornar ERROR: must be superuser , entre em contato com o suporte para solução de problemas.
    CREATE EXTENSION vector;
  2. Crie uma tabela com uma coluna vetorial. O número em vector(n) define a quantidade de dimensões.

    CREATE TABLE t (val vector(3));
  3. Insira os dados vetoriais. Carregue seus dados antes de criar índices para garantir um clustering preciso.

    INSERT INTO t (val) VALUES ('[0,0,0]'), ('[1,2,3]'), ('[1,1,1]'), (NULL);
  4. Crie um índice vetorial.

    CREATE INDEX ON t USING ivfflat (val vector_ip_ops) WITH (lists = 1);
  5. Consulte os vetores mais próximos. A cláusula ORDER BY classifica os resultados pela distância em relação a [3,3,3].

    SELECT * FROM t ORDER BY val <#> '[3,3,3]';

    Saída esperada:

     val
    ---------
     [1,2,3]
     [1,1,1]
     [0,0,0]
    (3 rows)

    O operador vector_ip_ops calcula distâncias usando o produto interno. A configuração WITH (lists = 1) coloca todos os vetores em um único cluster, adequado para pequenos conjuntos de dados. Para conjuntos de dados em produção, defina lists com base no volume de dados (consulte Ajustar parâmetros do IVFFlat).

Escolher uma estratégia de busca

Varredura sequencial versus varredura de índice

Use a varredura sequencial (sem índice) quando:

  • O conjunto de dados for pequeno e não houver previsão de expansão.

  • For necessário 100% de recall. Índices trocam recall por desempenho.

  • O volume de consultas for baixo e os ganhos de desempenho da varredura de índice não forem necessários.

Em todos os outros casos, crie um índice para obter melhor desempenho nas consultas.

HNSW versus IVFFlat

Fator

HNSW

IVFFlat

Recall

Maior

Moderado

Desempenho de consulta

Superior

Rápido

Tempo de criação do índice

Mais lento

Mais rápido

Uso de memória

Maior

Menor

Uso de armazenamento

Maior

Menor

Mais indicado para

Cargas de trabalho em produção que exigem alto recall

Grandes conjuntos de dados com requisitos moderados de recall

Prefira o HNSW quando o recall e o desempenho da consulta forem prioritários. Escolha o IVFFlat quando o tempo de criação do índice e o consumo de memória forem mais relevantes.

Operadores de distância

Todas as consultas de busca vetorial utilizam um operador de distância na cláusula ORDER BY:

Operador

Métrica de distância

Classe de operador

<->

Distância Euclidiana (L2)

vector_l2_ops

<=>

Distância do cosseno

vector_cosine_ops

<#>

Produto interno negativo

vector_ip_ops

O operador <#> retorna o produto interno negativo porque as varreduras de índice do PostgreSQL suportam apenas ordem ascendente. Para obter o valor real do produto interno, multiplique por -1:
SELECT (embedding <#> '[3,1,2]') * -1 AS inner_product FROM items;

Cada índice requer uma classe de operador correspondente à métrica de distância. Especifique a classe de operador ao criar o índice:

-- Euclidean distance
CREATE INDEX ON vecs USING hnsw(embedding vector_l2_ops);

-- Cosine distance
CREATE INDEX ON vecs USING hnsw(embedding vector_cosine_ops);

-- Inner product
CREATE INDEX ON vecs USING hnsw(embedding vector_ip_ops);

Ajustar parâmetros de índice

Ajustar parâmetros do HNSW

O HNSW possui dois parâmetros de construção e um parâmetro de consulta:

Parâmetro

Padrão

Intervalo

Efeito

m

16

2–100

Conexões máximas por camada. Valores maiores melhoram o recall, mas aumentam o tempo de criação do índice e o uso de memória. Comece com 12–48 para a maioria das cargas de trabalho.

ef_construction

64

4–100

Tamanho da lista de candidatos durante a criação do índice. Valores maiores melhoram o recall, mas tornam a construção do índice mais lenta. Deve ser pelo menos o dobro de m.

hnsw.ef_search

Tamanho da lista de candidatos durante as consultas. Defina este valor como pelo menos o número de resultados desejados (valor de LIMIT). Valores maiores melhoram o recall à custa da velocidade da consulta.

-- Create an HNSW index with custom parameters
CREATE TABLE vecs (id int PRIMARY KEY, embedding vector(1536));
CREATE INDEX ON vecs USING hnsw(embedding vector_l2_ops) WITH (m=16, ef_construction=64);

-- Increase ef_search at query time to improve recall
SET hnsw.ef_search = 100;
SELECT * FROM vecs ORDER BY embedding <-> '[...]' LIMIT 10;

Para ajustar índices HNSW:

  1. Comece com os valores padrão (m=16, ef_construction=64).

  2. Se o recall estiver abaixo da meta, aumente primeiro o ef_construction.

  3. Em seguida, ajuste o m para cima. Valores na faixa de 12–48 atendem à maioria dos casos de uso.

  4. Durante a consulta, aumente o hnsw.ef_search para melhorar o recall sem precisar recriar o índice.

Ajustar parâmetros do IVFFlat

O IVFFlat possui um parâmetro de construção (lists) e um parâmetro de consulta (ivfflat.probes):

Parâmetro

Efeito

lists

Número de listas invertidas (clusters). Mais listas melhoram o desempenho da consulta, mas reduzem o recall se probes não for aumentado proporcionalmente.

ivfflat.probes

Número de listas pesquisadas no momento da consulta. Valores maiores melhoram o recall, mas tornam as consultas mais lentas.

Defina lists com base no tamanho da sua tabela:

  • Até 1 milhão de linhas: lists = rows / 1000

  • Acima de 1 milhão de linhas: lists = sqrt(rows)

Configure ivfflat.probes no momento da consulta:

  • Use probes = sqrt(lists) como linha de base inicial.

  • Aumente probes para melhorar o recall. Definir probes = lists equivale a uma varredura sequencial completa.

-- Create an IVFFlat index for a 500,000-row table (lists = 500)
CREATE INDEX ON vecs USING ivfflat(embedding vector_l2_ops) WITH (lists = 500);

-- Set probes at query time
SET ivfflat.probes = 22; -- sqrt(500) = 22
SELECT * FROM vecs ORDER BY embedding <-> '[...]' LIMIT 10;
Importante

Crie o índice após carregar seus dados. O IVFFlat usa os dados existentes para determinar os centroides dos clusters. Um índice criado em uma tabela vazia ou esparsa gera clusters imprecisos, o que reduz significativamente o recall.

Para mais detalhes sobre parâmetros de índice, consulte o README do pgvector.

Próximos passos