Estou usando um aplicativo que usa PostgreSQL como seu banco de dados e ele usa a unaccent
extensão para normalizar texto. Quero melhorar sua funcionalidade de pesquisa modificando o unaccent.rules
arquivo.
Eu edito /usr/share/postgresql/16/tsearch_data/unaccent.rules
e adiciono algumas regras para o bloco unicode árabe ( U+0600
paraU+06ff
):
۰ 0
۱ 1
۲ 2
۳ 3
۴ 4
۵ 5
۶ 6
۷ 7
۸ 8
۹ 9
َ
e está funcionando bem.
SELECT unaccent('سَلام ۱۳۲');
unaccent
----------
سلام 123
(1 row)
Problema 1:
O problema é com o Zero Width Non-Joiner (ZWNJ - U+200C
). Ele deve ser substituído por espaço ( U+0020
).
سَلامعلیکم
->سلام علیکم
O que eu tentei:
Tentei essas linhas, mas nenhuma delas funciona ou dá erro:
"" " "
:invalid syntax: more than two strings in unaccent rule
(aviso) + não funcionou. " "
:invalid syntax: more than two strings in unaccent rule
(aviso) + não funcionou.\u200C \u0020
: Sugerido pelo ChatGPT, mas não funcionou.\u200C " "
: Sugerido pelo ChatGPT, mas não funcionou.
Nota.1:
Nas duas primeiras linhas acima, há um caractere ZWNJ invisível, que é mostrado como <200c> no VIM, mas não está visível nesta postagem.
Nota.2:
Não adicionei todas essas linhas ao mesmo tempo, testei uma por uma.
Nota 3:
Não há nenhuma outra regra para ZWNJ no
unaccent.rules
Problema 2:
Existe uma maneira de adicionar um novo arquivo de regras em vez de editar o padrão? Não consigo editar o código-fonte do aplicativo e alterar as consultas.
Adicionar algo como /usr/share/postgresql/16/tsearch_data/arabic.stop
ou /usr/share/postgresql/16/tsearch_data/arabic.rules
e reiniciar o serviço faz com que o PostgreSQL o entenda?
É necessário executar alguma consulta para recarregar o arquivo?
É necessário alterar a maneira como a pesquisa é solicitada no aplicativo?
O problema nº 1 é resolvido pelo PostgreSQL 17, conforme mencionado nas notas de versão e na mensagem de confirmação :
Problema nº 2:
apenas adicionar um
arabic.rules
arquivo será ineficaz. Os arquivos de regras correspondem a dicionários, veja especificamente essas declarações na parte SQL da extensão unaccent:Você pode criar outros dicionários, mas a
unaccent(text)
função fornecida com o Postgres procura ounaccent
dicionário.É necessário executar alguma consulta para recarregar o arquivo?
O arquivo é carregado no primeiro uso por cada backend e então mantido na memória pelo resto da sessão. Então, reconectar recarrega o arquivo. Não parece haver outra maneira.
É necessário alterar a maneira como a pesquisa é solicitada do aplicativo?
Você mencionou que não pode alterar o aplicativo. Mas se ele apenas chamar
unaccent()
sem uma qualificação de esquema, possivelmente você pode fornecer sua própriaunaccent(text)
função em um esquema que vem primeiro nasearch_path
ordem, sombreando assim a outra função.