Sugestão de uma pequena melhoria no processamento de busca em francês ("œ" e "æ" caracteres especiais)

Algumas palavras em francês usam os seguintes caracteres:

  • Œ, œ, como em œuf (ovo) ou cœur (coração), œuvre (várias traduções e significados, então não detalharei aqui, não importa), etc.
  • Æ, æ, como em nævus (o termo científico para pinta (a marca na pele, não o animal) ou outros.

æ é raramente usado (acho que são sempre termos científicos/médicos do latim?), mas œ, no entanto, está bastante presente na língua francesa.

Infelizmente, esses caracteres especiais não estão presentes no layout do teclado francês e muitas pessoas simplesmente escrevem “oe” ou “ae” em vez disso.
Mas alguns usuários têm layouts personalizados, e a autocorreção de smartphones, ou alguns outros sistemas de ajuda de escrita, frequentemente corrigem automaticamente as palavras usando os “caracteres mesclados” adequados, como “oeuvre” → “œuvre”.

Atualmente, a busca processa “oe” e “œ” como strings diferentes, o que leva a resultados diferentes que deveriam ser comuns.

Exemplo:
https://forum.monocycle.info/search?q=coeur
https://forum.monocycle.info/search?q=cœur

Minha sugestão é que “oe” e “œ”, “OE” e “Œ” sejam processados como strings idênticas. E também o mesmo para “ae” e “æ”, “AE” e “Æ”.

9 curtidas

Problema muito interessante @zogstrip / @j.jaffeux o que vocês acham? Poderíamos adicionar um normalizador por trás de uma configuração do site.

3 curtidas
SELECT to_tsvector('french', E'Cette oeuvre d\\'art n\\'est pas une œuvre.');
            to_tsvector             
------------------------------------
 'art':4 'cet':1 'oeuvr':2 'œuvr':9
(1 row)

Por alguma razão, pensei que lidar com diacríticos, ligaduras e afins era um problema resolvido ao lidar com buscas… Acho que não? :man_shrugging:

Como um :fr: eu definitivamente apoio isso. Parece que poderíamos usar o unaccent do postgresql, que remove acentos e também lida com ligaduras comuns.

SELECT to_tsvector('french', unaccent('œuvre poêle œuf Noël électroencéphalogramme æ Æ'));
                               to_tsvector                               
-------------------------------------------------------------------------
 'ae':6,7 'electroencephalogramm':5 'noel':4 'oeuf':3 'oeuvr':1 'poel':2
(1 row)
4 curtidas

E como um francês, você também odeia a complexidade inútil desta (embora interessante) língua tanto quanto eu? :smile:
Desculpe pelo leve humor fora do tópico

4 curtidas

Você acha que devemos simplesmente alterar a implementação de search_ignore_accents para usar unaccent ou precisaríamos de uma configuração totalmente nova?

Eu gosto de simplesmente alterar a implementação de ignorar acentos, pois há paridade com o que o PG faz de qualquer maneira.

3 curtidas

Essa é uma boa pergunta :thinking:
Definitivamente funcionaria para :fr:, mas pode haver outras localidades onde não funcionaria como esperado?
Depois de olhar os arquivos /usr/share/postgresql/13/tsearch_data/unaccent.rules, parece que é bem seguro.
Eu definitivamente apoio a remoção da alteração da nossa configuração search_ignore_accents para usar o unaccent do postgresql :+1:
@nbianca você pode adicionar isso à sua lista?

3 curtidas

Substituímos nossa antiga implementação Ruby pelo unaccent do Postgresql neste PR:

5 curtidas

Este tópico foi fechado automaticamente após 3 dias. Novas respostas não são mais permitidas.