A busca textual integrada do PostgreSQL oferece suporte a idiomas baseados em alfabeto, mas não tokeniza texto em chinês. A extensão pg_jieba resolve essa limitação ao segmentar o texto chinês em lexemas pesquisáveis, o que viabiliza a busca textual para conteúdo em chinês no PolarDB for PostgreSQL.
Versões compatíveis
A extensão pg_jieba está disponível em clusters do PolarDB for PostgreSQL que executam:
PostgreSQL 15 (versão de revisão 15.7.2.0 ou posterior)
PostgreSQL 14 (versão de revisão 14.5.2.0 ou posterior)
PostgreSQL 11 (versão de revisão 1.1.28 ou posterior)
Para verificar sua versão de revisão atual:
-
PostgreSQL 15 e 14:
SELECT version(); -
PostgreSQL 11:
SHOW polar_version;
Como funciona
O pg_jieba oferece três configurações de busca textual. Cada uma aplica uma estratégia diferente de tokenização, adequada a cenários específicos de pesquisa:
|
Configuração |
Modo |
Mais indicado para |
|
|
Modo exato |
Indexação. Divide o texto no conjunto mais preciso de termos, sem subpalavras redundantes. |
|
|
Modo completo |
Maximizar o recall nas consultas. Extrai todas as combinações possíveis de palavras, incluindo subpalavras. |
|
|
Modo exato com posição |
Quando são necessárias as posições de deslocamento de caracteres para cada token. Inclui também stop words que o modo exato remove. |
Como escolher entre o modo exato e o modo completo: Utilize jiebacfg na maioria dos cenários de indexação textual, pois retorna menos tokens e com maior precisão. Prefira jiebaqry quando perder um resultado de busca for mais crítico do que filtrar ruído; esse modo retorna todas as subpalavras possíveis, melhorando o recall ao custo de possíveis correspondências duplicadas.
Ativar e desativar a extensão
Somente contas privilegiadas podem executar essas instruções.
Para criar a extensão pg_jieba:
CREATE EXTENSION pg_jieba;
Para removê-la:
DROP EXTENSION pg_jieba;
Tokenizar texto em chinês
Todas as três configurações funcionam com a função padrão to_tsvector. O nome da configuração é o primeiro argumento.
Exemplo 1 — Entrada: '小明硕士毕业于中国科学院计算所,后在日本京都大学深造'
Modo exato (jiebacfg):
SELECT * FROM to_tsvector('jiebacfg', '小明硕士毕业于中国科学院计算所,后在日本京都大学深造');
to_tsvector
----------------------------------------------------------------------------------
'中国科学院':5 '小明':1 '日本京都大学':10 '毕业':3 '深造':11 '硕士':2 '计算所':6
(1 row)
Modo completo (jiebaqry) — retorna mais tokens, incluindo subpalavras como '中国', '学院' e '科学':
SELECT * FROM to_tsvector('jiebaqry', '小明硕士毕业于中国科学院计算所,后在日本京都大学深造');
to_tsvector
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
'中国':5 '中国科学院':9 '京都':16 '大学':17 '学院':7 '小明':1 '日本':15 '日本京都大学':18 '毕业':3 '深造':19 '硕士':2 '科学':6 '科学院':8 '计算':10 '计算所':11
(1 row)
Modo exato com posição (jiebacfg_pos) — inclui deslocamentos de caracteres e stop words como '于', '后' e '在':
SELECT * FROM to_tsvector('jiebacfg_pos', '小明硕士毕业于中国科学院计算所,后在日本京都大学深造');
to_tsvector
------------------------------------------------------------------------------------------------------------------------------------------
'中国科学院:7':5 '于:6':4 '后:16':8 '在:17':9 '小明:0':1 '日本京都大学:18':10 '毕业:4':3 '深造:24':11 '硕士:2':2 '计算所:12':6 ',:15':7
(1 row)
Exemplo 2 — Entrada: '李小福是创新办主任也是云计算方面的专家'
Modo exato (jiebacfg):
SELECT * FROM to_tsvector('jiebacfg', '李小福是创新办主任也是云计算方面的专家');
to_tsvector
-------------------------------------------------------------------
'专家':11 '主任':5 '云计算':8 '创新':3 '办':4 '方面':9 '李小福':1
(1 row)
Modo completo (jiebaqry) — também retorna '计算' como subpalavra de '云计算':
SELECT * FROM to_tsvector('jiebaqry', '李小福是创新办主任也是云计算方面的专家');
to_tsvector
-----------------------------------------------------------------------------
'专家':12 '主任':5 '云计算':9 '创新':3 '办':4 '方面':10 '李小福':1 '计算':8
(1 row)
Modo exato com posição (jiebacfg_pos) — inclui stop words como '是', '也' e '的' com seus respectivos deslocamentos:
SELECT * FROM to_tsvector('jiebacfg_pos', '李小福是创新办主任也是云计算方面的专家');
to_tsvector
---------------------------------------------------------------------------------------------------------------------------
'专家:17':11 '主任:7':5 '也:9':6 '云计算:11':8 '创新:4':3 '办:6':4 '方面:14':9 '是:10':7 '是:3':2 '李小福:0':1 '的:16':10
(1 row)
Usar dicionários personalizados
O pg_jieba aceita múltiplos dicionários personalizados. Carregue termos específicos do seu domínio em um dicionário personalizado para melhorar a precisão da segmentação do seu conteúdo.
Antes de usar dicionários personalizados, adicione pg_jieba ao parâmetro shared_preload_libraries. Configure esse parâmetro no console — consulte Configurar parâmetros do cluster. O cluster reinicia após você salvar essa alteração.
O exemplo a seguir demonstra como os termos de um dicionário personalizado alteram os resultados da segmentação. Sem o dicionário personalizado, '阿里云' e '研发工程师' são divididos em subpalavras. Após carregar o dicionário personalizado, eles passam a ser tratados como tokens únicos.
-
Insira termos no primeiro dicionário personalizado (índice
0, peso10):INSERT INTO jieba_user_dict VALUES ('阿里云'); INSERT INTO jieba_user_dict VALUES ('研发工程师', 0, 10); -
Verifique a segmentação com o dicionário integrado. Neste momento, o dicionário personalizado ainda não está ativo:
SELECT * FROM to_tsvector('jiebacfg', 'zth是阿里云的一个研发工程师');to_tsvector ------------------------------------------------------ 'zth':1 '一个':6 '云':4 '工程师':8 '研发':7 '阿里':3 (1 row)Observe que
'阿里云'foi dividido em'阿里'e'云', enquanto'研发工程师'foi dividido em'研发'e'工程师'. -
Mude para o dicionário personalizado
0:SELECT jieba_load_user_dict(0);jieba_load_user_dict ---------------------- (1 row) -
Execute a mesma consulta novamente. Os termos personalizados agora são reconhecidos como tokens únicos:
SELECT * FROM to_tsvector('jiebacfg', 'zth是阿里云的一个研发工程师');to_tsvector -------------------------------------------- 'zth':1 '一个':5 '研发工程师':6 '阿里云':3 (1 row)
Próximos passos
Especificar parâmetros do cluster — configure
shared_preload_librariespara ativar dicionários personalizados