Pesquisa Textual em Chinês no PostgreSQL com pg_jieba no ServBay
Visão Geral
Para idiomas como o inglês, o recurso de busca textual do PostgreSQL funciona bem com análise lexical baseada em espaços e sinais de pontuação. Porém, textos em chinês não possuem espaçamento natural, sendo necessária uma ferramenta especializada de segmentação de palavras para dividir sequências de caracteres chineses em termos semanticamente independentes.
O pg_jieba
é uma extensão de terceiros para o PostgreSQL que integra a popular biblioteca Jieba de segmentação de texto chinês. Com o pg_jieba
, você pode realizar segmentação de palavras eficiente e precisa em textos chineses diretamente no PostgreSQL, tornando possível construir sistemas robustos de busca textual em chinês.
Como um ambiente local de desenvolvimento web completo, o ServBay já vem pré-instalado com a extensão pg_jieba
, poupando você das etapas complicadas de compilação e instalação. Assim, você pode começar rapidamente a desenvolver e testar buscas em chinês no seu ambiente local.
Este artigo mostra como ativar, configurar e utilizar a extensão pg_jieba
no ServBay.
Pré-Requisitos
Antes de usar o pg_jieba
, verifique se você já:
- Instalou o ServBay no macOS e tem o banco de dados PostgreSQL rodando corretamente.
- Tem conhecimento básico em PostgreSQL, incluindo como se conectar e executar comandos SQL.
Instalação e Ativação do pg_jieba
O ServBay inclui a extensão pg_jieba
junto com o PostgreSQL, ou seja, não é necessário baixar ou compilar manualmente—basta ativá-la com um simples comando SQL no banco de dados desejado.
Siga os passos abaixo para ativar a extensão pg_jieba
:
Conecte-se ao seu banco de dados PostgreSQL: Abra o aplicativo Terminal e utilize o utilitário de linha de comando
psql
para se conectar ao seu banco de dados PostgreSQL. Substituayour_username
pelo seu usuário eyour_database
pelo nome do banco de dados. O padrão no ServBay costuma serservbay
oupostgres
.bashpsql -U your_username -d your_database
1Por exemplo, utilizando os valores padrão:
bashpsql -U servbay -d servbay
1Crie e ative a extensão
pg_jieba
: No prompt dopsql
, execute:sqlCREATE EXTENSION pg_jieba;
1Se a extensão já estiver criada, executar este comando novamente pode causar um erro, o que é esperado.
Verifique se a extensão foi ativada: Liste as extensões instaladas no banco:
sql\dx
1Se
pg_jieba
aparecer na lista, ela está ativa.
Configurando o pg_jieba para Busca Textual em Chinês
Após ativar a extensão pg_jieba
, você precisa configurar a busca textual do PostgreSQL para usar o pg_jieba
como segmentador de palavras.
Configurando a Busca Textual
A configuração da busca textual define como os documentos são processados para busca, incluindo qual parser realizar a segmentação de palavras e como diferentes tipos de tokens são tratados.
Crie uma nova configuração de busca textual: Crie uma configuração chamada
chinese
e defina opg_jieba
como seu parser.sqlCREATE TEXT SEARCH CONFIGURATION chinese (PARSER = pg_jieba);
1Isso fará com que o PostgreSQL utilize o
pg_jieba
para segmentação de palavras em textos.Adicione mapeamentos para os resultados da segmentação: O parser
pg_jieba
gera diferentes tipos de tokens dependendo da classe gramatical (part of speech). Para que possam ser indexados e pesquisados, esses tokens precisam ser mapeados para um dicionário. Aqui, mapeamos tokens mais comuns (como substantivos n, verbos v, adjetivos a etc.) para o dicionário nativosimple
do PostgreSQL, que não altera os tokens, usando-os como são extraídos pelo parser.sqlALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;
1Os códigos
n,v,a,i,e,l
representam possíveis classes gramaticais identificadas pelopg_jieba
. Você pode acrescentar, modificar ou remover conforme necessário. Outras classes comuns:n
: Substantivov
: Verboa
: Adjetivoi
: Expressão idiomáticae
: Interjeiçãol
: Expressão coloquialnr
: Nome de pessoans
: Nome de localnt
: Instituição/organizaçãonz
: Outros nomes própriosm
: Numeralq
: Classificadort
: Palavra temporals
: Palavra de localizaçãof
: Palavra direcionalp
: Preposiçãoc
: Conjunçãou
: Partículaxc
: Palavra funcionalw
: Pontuaçãoeng
: Inglêsx
: Caractere não-radical
Normalmente, você vai querer indexar e pesquisar substantivos, verbos, adjetivos e outros termos semanticamente relevantes.
Exemplo de Busca Textual com pg_jieba
Após a configuração, já é possível utilizar o pg_jieba
para realizar buscas textuais em chinês. Veja um exemplo:
Criando Tabela e Dados de Exemplo
Primeiro, crie uma tabela para armazenar documentos e insira alguns dados de exemplo contendo textos em chinês.
Crie a tabela:
sqlCREATE TABLE documents ( id SERIAL PRIMARY KEY, content TEXT );
1
2
3
4Insira dados de exemplo:
sqlINSERT INTO documents (content) VALUES ('我爱自然语言处理技术'), ('中文分词是文本处理的重要步骤'), ('pg_jieba是一个很好的中文分词工具,它基于结巴分词库'), ('ServBay 让本地开发变得简单高效');
1
2
3
4
5
Criando o Índice de Busca Textual
Para melhorar o desempenho, especialmente com grandes volumes de dados, é aconselhável criar um índice na coluna destinada à busca textual. O tipo de índice GIN (Generalized Inverted Index) do PostgreSQL é ideal para esta finalidade.
Crie o índice GIN: Use a função
to_tsvector
com a configuraçãochinese
para criar o índice na colunacontent
.to_tsvector('chinese', content)
converte o texto usando a segmentação chinesa dopg_jieba
.sqlCREATE INDEX idx_gin_content ON documents USING gin (to_tsvector('chinese', content));
1
Realizando Consultas de Busca Textual
Agora você pode usar a função to_tsquery
combinada com o operador @@
para buscar palavras/textos. to_tsquery('chinese', 'sua consulta')
converte sua frase usando a configuração chinese
, criando um tipo tsquery
. O operador @@
verifica se um tsvector
corresponde a determinado tsquery
.
Execute a consulta de busca: Busque documentos contendo as palavras “中文” e “分词”.
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', '中文 & 分词');
1
2
3
4
5O símbolo
&
significa "E" lógico notsquery
. Você também pode usar|
(OU lógico) e!
(NÃO lógico).Exemplo de busca por documentos com “ServBay” ou “开发”:
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', 'ServBay | 开发');
1
2
3
4
5
Dicionário Personalizado
O pg_jieba
utiliza o dicionário padrão da biblioteca Jieba. Em alguns casos, pode ser necessário adicionar termos personalizados (como jargões ou nomes de produto) para segmentação mais precisa.
Você pode criar um arquivo de dicionário personalizado e configurar o pg_jieba
para usá-lo.
Adicionando Termos Personalizados
Crie um arquivo de dicionário personalizado: No diretório de configuração do ServBay, crie um arquivo texto, por exemplo:
plaintext/Applications/ServBay/etc/pg_jieba/custom_dict.txt
1Este é apenas um caminho sugerido; ajuste de acordo com a estrutura de instalação do seu ServBay.
Inclua termos no arquivo de dicionário personalizado: Abra o arquivo
custom_dict.txt
em um editor de texto e coloque um termo por linha. É possível, opcionalmente, definir a frequência (frequency) e a classe gramatical (tag), separados por espaço. O formato é:termo [frequência [tag]]
. Quanto maior a frequência, maior a chance do termo ser identificado como palavra independente.plaintext自然语言处理 3 n ServBay 5 eng 结巴分词库 3 n
1
2
3Aqui,
3 n
indica que “自然语言处理” possui frequência 3 e é um substantivo (n);5 eng
sinaliza que “ServBay” tem frequência 5 e tag “eng” (inglês).Configure o
pg_jieba
para utilizar o dicionário personalizado: Na sessão do PostgreSQL, ajuste o parâmetropg_jieba.dict_path
para apontar para o diretório do seu dicionário personalizado. Atenção: normalmente,pg_jieba.dict_path
aponta para o diretório dos dicionários, não o arquivo em si. Se o arquivo personalizado estiver junto com o arquivo principal, pode não ser necessário mudar nada, ou siga instruções específicas do ServBay.O comando abaixo é baseado na documentação original; ajuste conforme seu ambiente:
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/'; -- Supondo que custom_dict.txt esteja neste diretório
1Ou, se seu pg_jieba permitir apontar diretamente para o arquivo (comportamento não padrão, apenas se necessário):
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/custom_dict.txt'; -- Use com cuidado e verifique conforme seu ServBay
1Importante: O comando
SET
só é válido para a sessão atual. Para uso permanente, altere o arquivopostgresql.conf
e defina o parâmetropg_jieba.dict_path
com o caminho desejado.
Recarregando o Dicionário
Após modificar o arquivo de dicionário personalizado ou alterar o parâmetro pg_jieba.dict_path
, é necessário pedir ao pg_jieba
para recarregar o dicionário.
Recarregue o dicionário: Execute a seguinte função SQL:
sqlSELECT jieba_reload_dict();
1Após a execução, operações de segmentação usarão o novo dicionário.
Perguntas Frequentes (FAQ)
Pergunta: Ao executar
CREATE EXTENSION pg_jieba;
, aparece o erro "extension 'pg_jieba' is not available". O que fazer? Resposta: Isso geralmente indica que o arquivo da extensão não está instalado corretamente no diretório de extensões do PostgreSQL ou não foi localizado. No ServBay, opg_jieba
já deve vir pré-instalado. Verifique se você está conectado ao PostgreSQL do ServBay e se a instalação não está corrompida. Se o problema persistir, reinicie o ServBay ou verifique os logs da plataforma.Pergunta: Meu dicionário personalizado não está funcionando. E agora? Resposta: Verifique:
- O caminho do arquivo do dicionário personalizado está correto e o usuário do PostgreSQL tem permissão de leitura.
- O formato do arquivo está adequado—um termo por linha e, se quiser, frequência e tag, separados por espaço.
- O parâmetro
pg_jieba.dict_path
foi configurado corretamente. Lembre-se que o comandoSET
é válido apenas para a sessão atual; para persistência, ajuste opostgresql.conf
. - A função
SELECT jieba_reload_dict();
foi executada para recarregar o dicionário. - Se editou o
postgresql.conf
, reinicie o PostgreSQL.
Pergunta: Os resultados da busca textual estão imprecisos. O que posso fazer? Resposta: A precisão da busca textual depende tanto da segmentação quanto da formulação da consulta.
- Revise a segmentação: Use
ts_debug('chinese', 'seu texto')
para inspecionar como determinado texto foi segmentado pela configuraçãochinese
e se o dicionário personalizado está funcionando. - Ajuste o mapeamento da configuração: No comando
ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR ... WITH simple;
, inclua apenas as classes gramaticais relevantes (remova partículas, pontuações etc). - Melhore a consulta: Certifique-se que palavras-chave e operadores lógicos (
&
,|
,!
) emto_tsquery
estão de acordo com sua intenção de busca.
- Revise a segmentação: Use
Conclusão
O pg_jieba
é uma poderosa ferramenta para implementar busca textual em chinês no PostgreSQL. Com a extensão já pré-instalada pelo ServBay, os desenvolvedores podem ativar e configurar facilmente a segmentação de palavras em ambientes locais. Seguindo este guia, você aprendeu a instalar o pg_jieba
, criar e configurar buscas textuais, realizar consultas básicas e utilizar dicionários personalizados para otimizar os resultados. Aplicando essas técnicas em seus projetos, você potencializa significativamente a capacidade de busca de conteúdos em chinês.