Sugerencia de una ligera mejora en el procesamiento de búsquedas en francés ("œ" y "æ" caracteres especiales)

Algunas palabras francesas utilizan los siguientes caracteres:

  • Œ, œ, como en œuf (huevo) o cœur (corazón), œuvre (múltiples traducciones y significados, así que no los detallaré aquí, no importa), etc..
  • Æ, æ, como en nævus (el término científico para lunar (el punto en la piel, no el animal) o otros.

æ se usa raramente (¿creo que siempre son términos científicos/médicos del latín?), pero œ, sin embargo, está bastante presente en el idioma francés.

Lamentablemente, estos caracteres especiales no están presentes en la distribución del teclado francés y mucha gente simplemente escribe “oe” o “ae” en su lugar.
Pero algunos usuarios tienen distribuciones personalizadas, y la autocorrección de los teléfonos inteligentes, u otros sistemas de ayuda a la escritura, a menudo corrigen automáticamente las palabras utilizando los “caracteres fusionados” adecuados, como “oeuvre” → “œuvre”.

Actualmente, la búsqueda procesa “oe” y “œ” como cadenas diferentes, lo que lleva a resultados diferentes que deberían ser comunes.

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

Mi sugerencia es que “oe” y “œ”, “OE” y “Œ” se procesen como cadenas idénticas. Y lo mismo para “ae” y “æ”, “AE” y “Æ”.

9 Me gusta

Problema muy interesante @zogstrip / @j.jaffeux ¿qué opinas? Podríamos añadir un normalizador detrás de una configuración del sitio.

3 Me gusta
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 alguna razón, pensé que el manejo de diacríticos, ligaduras y demás era un problema resuelto cuando se trataba de búsquedas… ¿Supongo que no? :man_shrugging:

Como :fr: definitivamente apoyo eso. Parece que podríamos usar el unaccent de postgresql que elimina los acentos y también maneja las ligaduras comunes.

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 Me gusta

Y como francés, ¿tú también odias la inútil complejidad de este (aunque interesante) idioma tanto como yo? :smile:
Perdón por el ligero humor fuera de tema

4 Me gusta

¿Crees que deberíamos simplemente modificar la implementación de search_ignore_accents para usar unaccent o necesitaríamos una configuración completamente nueva?

Me gusta la idea de cambiar simplemente la implementación de ignorar acentos porque de todos modos hay paridad con lo que hace PG.

3 Me gusta

Esa es una buena pregunta :thinking:
Definitivamente funcionaría para :fr: pero ¿podría haber otras locales donde no funcione como se espera?
Después de revisar los archivos /usr/share/postgresql/13/tsearch_data/unaccent.rules, parece bastante seguro.
Definitivamente apoyo eliminar el cambio de nuestra configuración search_ignore_accents para usar el unaccent de postgresql :+1:
@nbianca ¿puedes añadir esto a tu lista?

3 Me gusta

Reemplacé nuestra antigua implementación de Ruby con unaccent de Postgresql en esta PR:

5 Me gusta

Este tema se cerró automáticamente después de 3 días. Ya no se permiten nuevas respuestas.