Aqui vai uma história sobre minha busca para melhorar a pesquisa em uma instância de fórum em tcheco.
Infelizmente, o PostgreSQL atual (12) não vem com um dicionário tcheco embutido. O idioma tcheco possui 7 declinações (ou seja, um substantivo pode assumir 7 formas diferentes dependendo do contexto), então, como você pode imaginar, a pesquisa funciona muito mal para nós.
Descobri como adicionar o dicionário e fazê-lo funcionar dentro da instância Docker (detalhes abaixo), mas mesmo após a reindexação, ainda não consegui fazê-lo funcionar. Acontece que o Discourse seleciona o dicionário com base nas configurações de default_locale e o seleciona apenas para os idiomas que já vêm com o PostgreSQL — ele usa o dicionário simple para todos os outros.
Por favor, podemos ter uma configuração de site adicional para especificar um dicionário de pesquisa personalizado?
Verifiquei que tudo começa a funcionar quando edito manualmente o arquivo lib/search.rb.
Aqui está o que fiz para adicionar o dicionário, essencialmente replicando os passos descritos aqui:
e aqui:
sudo ./launcher enter app
# O seguinte também deve ser adicionado ao container/app.yml para ser executado a cada reconstrução do contêiner
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;
# Verificar
\dF
# Testar
select * from ts_debug('czech_unaccent','Prilis zlutoucky kun se napil zlute vody');
Ctrl-D
rake search:reindex
Ctrl-D
# Em containers/app.yml, defina
db_default_text_search_config: "public.czech"
# reconstruir
Há mais uma pegadinha relacionada aos acentos. A abordagem acima baixa o dicionário sem acentos, então funcionará junto com a configuração search ignore accents ativada. Se você quiser pesquisar com acentos, deve baixar o dicionário de https://postgres.cz/data/czech.tar.gz.
Acho que essa pegadinha também se aplica a outros idiomas com suporte padrão do PostgreSQL.
Se você remover os acentos, está essencialmente desativando o stemmer para o seu idioma em palavras que contêm caracteres acentuados. Portanto, não está claro se esse recurso deve ser ativado para esses idiomas.