Melhores Práticas de Busca de Texto Completo
Como Usar Esta Lista
- Aplique antes de enviar a busca voltada para o usuário para produção.
- Execute novamente após importações em massa de conteúdo ou alterações de dicionário.
- Emparelhe com a lista de verificação de busca híbrida se o pgvector estiver habilitado.
A - Schema e Vetores
- Armazene
tsvectorem uma coluna, nãoto_tsvector()em tempo de execução no WHERE. Gerado ARMAZENADO ou mantido por trigger. - Pondere o título mais alto que o corpo.
setweightA para título, B para corpo, C para tags. - Escolha a configuração por tipo de conteúdo.
englishpara prosa;simplepara SKUs e códigos de erro. - Mantenha o conteúdo e o vetor sincronizados. Transação única atualiza o texto e quaisquer campos derivados.
- Adicione colunas de tenant ou ACL antes dos índices. Filtre cedo em consultas híbridas e FTS.
B - Índices
- Use GIN como padrão em
tsvector. GiST apenas após benchmark com muitas escritas provar benefício. - Construa com
CREATE INDEX CONCURRENTLYem tabelas grandes. Evite bloqueios de escrita em produção. - Reindexe após importações em massa.
REINDEX INDEX CONCURRENTLYou reconstrua durante a janela de manutenção. - Execute
ANALYZEapós a reindexação. O planejador precisa de estatísticas atualizadas para varreduras de bitmap. - Índices parciais para linhas publicadas apenas. Reduz o índice quando há muitos rascunhos.
C - Consultas e UX
- Nunca concatene a entrada do usuário em strings
tsquery. Useplainto_tsqueryouwebsearch_to_tsquery. - Limite a expansão OR. Exija um
ts_rankmínimo ou limite os termos OR dos parsers do usuário. - Forneça snippets com
ts_headline. Melhora a UX dos resultados sem análise do lado do aplicativo. - Ordene por classificação e depois por recência.
ORDER BY rank DESC, published_at DESCdesempata de forma sensata. - Registre consultas com zero resultados. Alimente o dicionário de sinônimos e a análise de lacunas de conteúdo.
D - Operações
- Monitore o tamanho do índice GIN e
idx_scan.idx_scanplano com consultas lentas significaANALYZEausente ou configuração incorreta. - Ajuste o autovacuum em tabelas de busca com muitas atualizações. Atualizações de texto regeneram vetores e páginas GIN.
- Documente alterações de dicionário e sinônimos. Requer reindexação ou reconstrução de vetores em alguns casos.
- Faça benchmark antes do Elasticsearch. Prove que o FTS do Postgres não atende aos SLOs com concorrência realista.
- Teste políticas RLS com a função de API de busca. FTS herda políticas de tabela; verifique o isolamento do tenant.
FAQs
Quando reindexar?
Após importação em massa com COPY, atualização de versão principal ou alterações de arquivo de dicionário que afetam o stemming.fastupdate ativado ou desativado?
Ativado para um fluxo constante de inserções; considere desativado durante carga massiva e depois reindexe.Pesos da busca híbrida?
Documente os pesos iniciais; avalie recall@10 trimestralmente em consultas de referência.Multi-idioma?
Separate tsvector por idioma ou `simple` mais modelos de embedding específicos do idioma.Necessidades de subcadeia?
Adicione índice `pg_trgm` ao lado do GIN; exponha diferentes modos de busca na API.Volume de dados de staging?
Use tamanho de corpus representativo; staging vazio oculta erros de varredura sequencial.Poolers de conexão?
Modo de transação do pgbouncer OK; a busca é uma carga de trabalho SELECT com muitas leituras.Réplicas de leitura?
Roteie leituras de busca para réplicas; aceite latência de replicação para índices quase em tempo real.Escape hatch do OpenSearch?
Documente os critérios do ADR antes da adoção; escrita dupla é cara.Verificações de CI?
A migração lint garante que a coluna gerada e o índice GIN sejam criados juntos.Relacionados
- Básicos de Busca de Texto Completo - FTS vs Elasticsearch ADR
- Índices GIN para FTS - construção e manutenção
- tsvector & tsquery - classificação e dicionários
- Busca Híbrida - combinação com pgvector
- Melhores Práticas de Design de Índice - higiene geral de índice
Versões da Stack: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PostGIS 3.5+, pgbouncer 1.x e Patroni 3.x.