Ecco quindi una storia sulla mia ricerca per migliorare la ricerca su un’istanza di forum ceca.
Purtroppo, PostgreSQL (12) attuale non include un dizionario ceco predefinito. La lingua ceca ha 7 declinazioni (cioè un sostantivo può assumere 7 forme diverse a seconda del contesto), quindi, come potete immaginare, la ricerca funziona piuttosto male per noi.
Ho capito come aggiungere il dizionario e farlo funzionare all’interno dell’istanza Docker (dettagli sotto), ma non sono riuscito a farlo funzionare nemmeno dopo il reindicizzazione. Si è scoperto che Discourse seleziona il dizionario in base alle impostazioni di default_locale e lo seleziona solo per le lingue fornite con Postgres; per tutte le altre utilizza il dizionario simple.
Per favore, possiamo avere un’impostazione del sito aggiuntiva per specificare un dizionario di ricerca personalizzato?
Ho verificato che tutto inizia a funzionare quando ho modificato manualmente lib/search.rb.
Ecco cosa ho fatto per aggiungere il dizionario, essenzialmente replicando i passaggi da qui:
e qui:
sudo ./launcher enter app
# Quanto segue dovrebbe essere aggiunto anche a container/app.yml in modo che venga eseguito ad ogni ricompilazione del contenitore
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;
# Verifica
\dF
# Test
select * from ts_debug('czech_unaccent','Prilis zlutoucky kun se napil zlute vody');
Ctrl-D
rake search:reindex
Ctrl-D
# In containers/app.yml imposta
db_default_text_search_config: "public.czech"
# Ricompila
C’è un’altra insidia con i diacritici. L’approccio sopra scarica il dizionario senza diacritici, quindi funzionerà insieme alle impostazioni search ignore accents attivate. Se vuoi cercare con i diacritici, dovresti scaricare il dizionario da https://postgres.cz/data/czech.tar.gz.
Penso che questa insidia si applichi anche ad altre lingue con supporto Postgres predefinito.
Se rimuovi gli accenti, stai essenzialmente disattivando lo stemmer per la tua lingua per le parole contenenti caratteri accentati. Quindi non è affatto chiaro se questa funzionalità debba essere attivata per queste lingue.