Итак, вот история о моей миссии по улучшению поиска на чешском экземпляре форума.
К сожалению, текущая версия PostgreSQL (12) не поставляется со встроенным чешским словарем. Чешский язык имеет 7 падежей (то есть существительное может принимать 7 различных форм в зависимости от контекста), поэтому, как вы можете представить, поиск работает у нас довольно плохо.
Мне удалось разобраться, как добавить словарь и заставить его работать внутри Docker-контейнера (подробности ниже), но даже после перестроения индекса (reindex) он все равно не работал. Оказалось, что Discourse выбирает словарь на основе настроек default_locale и использует его только для языков, которые поставляются вместе с Postgres — для всех остальных он использует словарь simple.
Пожалуйста, можно ли добавить отдельную настройку сайта для указания пользовательского словаря поиска?
Я проверил, что все начинает работать, когда я вручную редактировал файл lib/search.rb.
Вот что я сделал для добавления словаря, по сути повторив шаги отсюда:
и отсюда:
sudo ./launcher enter app
# Следующую команду также следует добавить в container/app.yml, чтобы она выполнялась при каждой пересборке контейнера
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;
# Проверка
\dF
# Тест
select * from ts_debug('czech_unaccent','Prilis zlutoucky kun se napil zlute vody');
Ctrl-D
rake search:reindex
Ctrl-D
# В containers/app.yml установите
db_default_text_search_config: "public.czech"
# Пересборка
Есть еще одна проблема с диакритическими знаками. Описанный выше подход загружает словарь без диакритики, поэтому он будет работать вместе с настройкой search ignore accents (игнорировать ударения), если она включена. Если вы хотите искать с учетом диакритики, вам следует загрузить словарь по адресу https://postgres.cz/data/czech.tar.gz.
Думаю, эта проблема касается и других языков, поддерживаемых Postgres по умолчанию.
Если вы убираете ударения, вы по сути отключаете стеммер для своего языка для слов, содержащих диакритические знаки. Поэтому не совсем понятно, следует ли включать эту функцию для таких языков.