Quando sua aplicação precisa pesquisar grandes volumes de texto não estruturado — como documentos, conteúdo gerado por usuários ou descrições de produtos — a correspondência simples de palavras-chave é insuficiente. O oferece recursos nativos de busca de texto completo, incluindo tokenização, indexação invertida, classificação de resultados e extensões para segmentação de texto em chinês e correspondência aproximada.
Como funciona a busca de texto completo
Diferentemente das buscas baseadas em palavras-chave, que verificam campos ou tags específicos, a busca de texto completo examina todo o conteúdo dos documentos para localizar informações relevantes. Essa abordagem é ideal para recuperar resultados em grandes coleções de texto não estruturado.
O pipeline de busca de texto completo compreende quatro etapas:
Pré-processamento de texto: realiza a tokenização do texto, remove stopwords e aplica stemming para aumentar a precisão da recuperação.
Construção de índice: crie um índice invertido sobre o texto pré-processado para rastrear a posição de cada termo nos documentos.
Processamento de consulta: analisa a consulta e a converte em um formato compatível com o índice.
Classificação de resultados: pontua e ordena os resultados por relevância, garantindo que os documentos mais pertinentes apareçam primeiro.
Casos de uso
Gestão documental: pesquise documentos internos, relatórios e contratos para reduzir o tempo de recuperação.
Busca online: exiba rapidamente resultados relevantes em grandes acervos de conteúdo da web ou intranet.
Pesquisa acadêmica: localize artigos e dados relevantes em bases acadêmicas e coleções bibliográficas.
E-commerce: permita que clientes encontrem produtos por palavra-chave, descrição ou correspondência parcial, melhorando a experiência de compra.
Redes sociais: busque publicações, comentários e conteúdo gerado por usuários usando palavras-chave.
Pesquisa jurídica: auxilie profissionais do direito a localizar rapidamente jurisprudências e legislações pertinentes.
Prontuários médicos: recupere informações de pacientes e históricos em relatórios clínicos.
Suporte ao cliente: apresente artigos de FAQ e documentos de suporte relevantes em portais de autoatendimento.
Gestão de conteúdo: indexe o conteúdo de sites ou blogs para que os visitantes encontrem artigos relevantes com agilidade.
Sistemas de biblioteca: permita que leitores pesquisem catálogos de livros e artigos por título, autor ou assunto.
Recursos
Tokenização
Antes que um documento possa ser pesquisado, o o pré-processa e armazena um índice para consultas futuras. O pré-processamento de texto envolve três etapas:
Analisar o documento em tokens — números, palavras, palavras compostas e endereços de e-mail — para que cada tipo de token seja processado independentemente.
Normalizar tokens em lexemas, convertendo-os para minúsculas e removendo sufixos como s ou es. Isso unifica variações de palavras em uma única forma, aumentando a precisão da busca.
Armazenar o documento pré-processado como um array ordenado de lexemas, juntamente com informações posicionais. Os dados de posição são usados na classificação por relevância: um documento em que os termos da consulta estão agrupados recebe uma pontuação maior do que aquele em que estão dispersos.
tsvector
O tipo de dado tsvector no armazena uma lista ordenada de lexemas e suas posições no documento. Para cargas de trabalho em produção, recomenda-se armazenar o texto processado em uma coluna tsvector em vez de calculá-lo durante a consulta.
Por exemplo, adicione uma coluna tsvector gerada a uma tabela e crie um índice GIN (Generalized Inverted Index) sobre ela para que o índice seja atualizado automaticamente a cada gravação:
ALTER TABLE documents
ADD COLUMN search_vector tsvector
GENERATED ALWAYS AS (to_tsvector('english', title || ' ' || body)) STORED;
CREATE INDEX documents_search_idx ON documents USING GIN (search_vector);
pg_bigm
A extensão do habilita a busca de texto aproximada usando n-gramas (n-tuplas de caracteres). É adequada para aplicações com grande volume de dados textuais, como mecanismos de busca e sistemas de gestão de conteúdo, sendo especialmente eficaz para textos em idiomas asiáticos, nos quais as fronteiras entre palavras não são marcadas por espaços.
O pg_bigm melhora significativamente a eficiência de buscas com curingas, como %keyword%.
pg_trgm
O pg_trgm é uma extensão do que indexa texto usando trigramas — sequências contíguas de três caracteres. Oferece suporte a correspondência aproximada, busca por similaridade, autocompletar e correção ortográfica. Assim como o pg_bigm, o pg_trgm lida eficientemente com consultas usando curingas.
O pg_trgm melhora significativamente a eficiência de buscas com curingas, como %keyword%.
Segmentação de texto em chinês
A busca de texto padrão do PostgreSQL não segmenta corretamente o texto em chinês, pois esse idioma não utiliza espaços para delimitar palavras. O resolve essa limitação com duas extensões: pg_jieba e Zhparser.
pg_jieba
A extensão integra a biblioteca de segmentação de palavras Jieba ao PolarDB. O Jieba é uma biblioteca amplamente utilizada para segmentação de texto em chinês que identifica as fronteiras entre palavras em frases, viabilizando a busca de texto completo nesse idioma.
Zhparser
O Simple Chinese Word Segmentation (SCWS) é um mecanismo de código aberto para segmentação de palavras em chinês, baseado em dicionários de frequência de palavras.
O é construído sobre o SCWS e se integra à busca de texto completo do PostgreSQL. Oferece diversas opções de configuração e dicionários personalizados para ajustar a segmentação de texto em chinês.
Indexação
O disponibiliza dois tipos de índice para busca de texto completo: GIN e RUM.
Indexação GIN
O Generalized Inverted Index (GIN) é o tipo de índice nativo do PostgreSQL para busca de texto completo. Os índices GIN são otimizados para os tipos de dado tsvector e tsquery, proporcionando alta velocidade em consultas textuais complexas sobre grandes conjuntos de dados. O GIN também suporta JSONB e outros tipos de dados compostos.
Indexação RUM
A extensão do PostgreSQL fornece o tipo de índice RUM para consultas de busca de texto completo com classificação por relevância.
Assim como o GIN, o RUM é um índice invertido. Ele armazena metadados adicionais — como as posições dos termos dentro de um documento — junto às entradas do índice. Durante uma consulta, o RUM usa esses dados de posição armazenados para calcular a classificação de relevância sem acessar o documento original, tornando as consultas classificadas mais rápidas do que no GIN.
Processamento de consulta
tsquery
O tsquery é um tipo de dado usado para expressar condições de busca de texto completo no . Utilize-o em conjunto com tsvector e o operador de correspondência @@ para executar consultas de texto completo.
O banco de dados também fornece a função to_tsquery e funções relacionadas para converter texto simples em valores tsquery:
|
Função |
Descrição |
|
|
Analisa e normaliza termos; suporta operadores booleanos |
|
|
Trata a entrada como uma frase; todos os termos são combinados com AND |
|
|
Exige que os termos apareçam na ordem especificada |
|
|
Aceita sintaxe de busca no estilo Google |
O tsquery suporta os seguintes operadores para criar condições compostas:
@@— corresponde umtsvectora umtsquery&— AND: ambos os termos devem corresponder|— OR: pelo menos um dos termos deve corresponder!— NOT: o termo não deve corresponder
Classificação por relevância
ts_rank
A função ts_rank do PostgreSQL pontua o nível de correspondência entre um documento tsvector e um tsquery. Use essa pontuação para ordenar os resultados, colocando os documentos mais relevantes no topo:
SELECT title, ts_rank(search_vector, query) AS rank
FROM documents, to_tsquery('english', 'database & search') query
WHERE search_vector @@ query
ORDER BY rank DESC;