Пользовательский словарь для полнотекстового поиска в Postgres

Итак, вот история о моей миссии по улучшению поиска на чешском экземпляре форума.

К сожалению, текущая версия 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 по умолчанию. :frowning: Если вы убираете ударения, вы по сути отключаете стеммер для своего языка для слов, содержащих диакритические знаки. Поэтому не совсем понятно, следует ли включать эту функцию для таких языков.

4 лайка

@sam, вы были бы открыты к PR по вышеизложенному?

В качестве альтернативы мы могли бы модифицировать базовый образ Docker, чтобы по умолчанию включать больше словарей поиска Postgres, но это было бы гораздо сложнее.