SQL Academy · Aula

Busca de texto completo com tsvector e GIN

Crie uma busca de texto completo pronta para produção com colunas tsvector, índices GIN e dicionários configuráveis de busca textual.

Aula 2 de 414 etapas

Busca de texto completo com tsvector e GIN é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.

Além de substrings: pesquisa orientada a palavras

A pesquisa de texto completo (FTS) entende palavras: lematização, palavras de parada e classificação. O PostgreSQL oferece esse recurso integrado por meio dos tipos tsvector e tsquery.

Criar um tsvector

Analisar um documento:

SELECT to_tsvector('english', 'The quick brown foxes jumped over');
-- 'brown':3 'fox':4 'jump':5 'quick':2

Criar um tsquery

Analisar uma consulta:

SELECT to_tsquery('english', 'fox & jumping');     -- 'fox' & 'jump'
SELECT websearch_to_tsquery('english', 'fox jumping -lazy');

Correspondência: @@

Testar um documento em relação a uma consulta:

SELECT 'fox jumping'::tsvector @@ 'fox & jump'::tsquery;     -- t

Indexação para FTS

Adicionar uma coluna tsvector e um índice GIN:

ALTER TABLE articles
  ADD COLUMN search_doc tsvector
    GENERATED ALWAYS AS (
      to_tsvector('english', coalesce(title,'') || ' ' || coalesce(body,''))
    ) STORED;

CREATE INDEX articles_search_idx ON articles USING GIN (search_doc);

Consultas

Pesquisa filtrada rápida:

SELECT id, title FROM articles
WHERE search_doc @@ websearch_to_tsquery('english', 'postgres performance')
ORDER BY ts_rank(search_doc, websearch_to_tsquery('english', 'postgres performance')) DESC
LIMIT 20;

Classificação com ts_rank

ts_rank atribui uma pontuação aos resultados com base na frequência e na posição das palavras. ts_rank_cd usa densidade de cobertura (considerando a posição):

SELECT id, ts_rank_cd(search_doc, q) AS rank
FROM articles, websearch_to_tsquery('english', $1) AS q
WHERE search_doc @@ q
ORDER BY rank DESC LIMIT 20;

Trechos com ts_headline

Mostrar fragmentos correspondentes com as palavras encontradas destacadas:

SELECT ts_headline('english', body,
  websearch_to_tsquery('english', $1),
  'StartSel=<mark>, StopSel=</mark>, MaxFragments=2')
FROM articles
WHERE search_doc @@ websearch_to_tsquery('english', $1);

Pesquisa por frase

Encontrar palavras adjacentes:

SELECT * FROM articles
WHERE search_doc @@ phraseto_tsquery('english', 'database performance');

Pesos para vários campos

Atribuir mais peso ao título do que ao corpo usando setweight:

ALTER TABLE articles
  ADD COLUMN search_doc tsvector
    GENERATED ALWAYS AS (
      setweight(to_tsvector('english', coalesce(title,'')), 'A') ||
      setweight(to_tsvector('english', coalesce(body,'')),  'B')
    ) STORED;

Configuração de idioma

A configuração english define palavras de parada, lematização etc. O PostgreSQL inclui muitos idiomas; alterne o idioma conforme necessário:

SELECT to_tsvector('turkish', 'Veritabanı performansı');

Limitações da FTS integrada

É adequada para idiomas semelhantes ao inglês e oferece uma classificação básica. Para necessidades mais avançadas (BM25, embeddings vetoriais e pesquisa facetada), considere usar Elasticsearch ou OpenSearch junto com o Postgres.

Recapitulação

A FTS do PostgreSQL é uma opção padrão competente.

  • tsvector + tsquery + correspondência com @@
  • Índice GIN para obter velocidade
  • websearch_to_tsquery para entrada humana
  • ts_rank/ts_headline para resultados classificados e destacados

Verificação rápida

Você precisa filtrar rapidamente artigos por uma consulta de texto completo. Qual índice deve usar?

Grátis para começar

Aprenda SQL com um tutor de IA — grátis

Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.

Cursos
46
Aulas
183

Perguntas Frequentes

A aula “Busca de texto completo com tsvector e GIN” é grátis?

Sim — o texto completo de “Busca de texto completo com tsvector e GIN” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.

O que vou aprender em “Busca de texto completo com tsvector e GIN”?

Crie uma busca de texto completo pronta para produção com colunas tsvector, índices GIN e dicionários configuráveis de busca textual. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar SQL Academy?

Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Busca de texto completo com tsvector e GIN”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de SQL Academy?

Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Busca por trigramas (pg_trgm) para correspondência aproximada
  2. Busca de texto completo com tsvector e GIN
  3. Indexação geoespacial com PostGIS
  4. Busca vetorial com pgvector
← Voltar para SQL Academy