Postgres フルテキスト検索用のカスタム辞書

さて、チェコのフォーラムインスタンスでの検索機能改善に向けた私の取り組みについてお話します。

残念ながら、現在の PostgreSQL (12) には組み込みのチェコ語辞典が含まれていません。チェコ語には 7 つの格変化(つまり、名詞は文脈に応じて 7 つの異なる形をとる)があるため、想像できるように、検索機能は私たちの環境では非常に不十分です。

辞典の追加方法と Docker インスタンス内での動作確認方法を突き止めました(詳細は後述)。しかし、インデックスを再構築しても動作しませんでした。実は、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"
# 再構築

もう一つ、母音符号(diacritics)に関する注意点があります。上記のアプローチでは母音符号なしの辞典をダウンロードするため、「アクセントを無視して検索」設定がオンになっている場合にのみ機能します。母音符号付きで検索したい場合は、https://postgres.cz/data/czech.tar.gz から辞典をダウンロードする必要があります。

この注意点は、Postgres の標準サポート対象となっている他の言語にも当てはまると思います。:frowning: アクセントを除去すると、アクセントを含む単語に対しては言語のステミング機能が事実上無効化されてしまいます。そのため、これらの言語に対してこの機能をオンにするべきかどうかは、必ずしも明確ではありません。

「いいね!」 4

@sam 上記について PR を受け付けていただけるでしょうか?

あるいは、デフォルトでより多くの Postgres 検索辞書を含むように Docker ベースイメージを変更することも可能ですが、それははるかに困難です。