Voici donc l’histoire de ma quête pour améliorer la recherche sur une instance de forum tchèque.
Malheureusement, PostgreSQL (12) actuel ne propose pas de dictionnaire tchèque intégré. La langue tchèque compte sept déclinaisons (c’est-à-dire qu’un nom peut prendre sept formes différentes selon le contexte), donc, comme vous pouvez l’imaginer, la recherche fonctionne plutôt mal pour nous.
J’ai trouvé comment ajouter le dictionnaire et le faire fonctionner à l’intérieur de l’instance Docker (détails ci-dessous), mais je n’ai toujours pas réussi à le faire fonctionner, même après une réindexation. Il s’avère que Discourse sélectionne le dictionnaire en fonction des paramètres default_locale et ne le choisit que pour les langues fournies avec PostgreSQL ; il utilise le dictionnaire simple pour toutes les autres.
S’il vous plaît, pouvons-nous avoir un paramètre de site supplémentaire pour spécifier un dictionnaire de recherche personnalisé ?
J’ai vérifié que tout fonctionne dès que j’ai modifié manuellement lib/search.rb.
Voici ce que j’ai fait pour ajouter le dictionnaire, en reprenant essentiellement les étapes décrites ici :
et ici :
sudo ./launcher enter app
# Les lignes suivantes doivent également être ajoutées à container/app.yml afin d'être exécutées à chaque reconstruction du conteneur
curl -L https://github.com/freaz/docker-postgres-czech-unaccent/raw/master/czech_unaccent.tar.gz | tar -xzC /tmp/ && mv /tmp/fulltext_dicts/czech* /usr/share/postgresql/1?/tsearch_data/
sudo -u postgres psql discourse
CREATE TEXT SEARCH DICTIONARY czech
(template=ispell, dictfile = czech_unaccent, afffile=czech_unaccent, stopwords=czech_unaccent);
CREATE TEXT SEARCH CONFIGURATION czech (copy=english);
ALTER TEXT SEARCH CONFIGURATION czech
ALTER MAPPING FOR word, asciiword WITH cspell, simple;
# Vérification
\dF
# Test
select * from ts_debug('czech_unaccent','Prilis zlutoucky kun se napil zlute vody');
Ctrl-D
rake search:reindex
Ctrl-D
# Dans containers/app.yml, définir
db_default_text_search_config: "public.czech"
# Reconstruire
Il y a une autre subtilité concernant les diacritiques. L’approche ci-dessus télécharge un dictionnaire sans diacritiques, ce qui fonctionnera donc avec le paramètre « search ignore accents » activé. Si vous souhaitez rechercher avec les diacritiques, vous devez télécharger le dictionnaire depuis https://postgres.cz/data/czech.tar.gz.
Je pense que cette subtilité s’applique également à d’autres langues prises en charge par défaut dans PostgreSQL.
Si vous supprimez les accents, vous désactivez essentiellement le lemmatiseur pour votre langue pour les mots contenant des caractères accentués. Il n’est donc pas du tout clair si cette fonctionnalité devrait être activée pour ces langues.