AnalyticDB for PostgreSQL インスタンスにインストールされている pgsearch 拡張機能は、中国語(CN_SIMPLE)および英語(EN_SIMPLE)の組み込みストップワード辞書を提供します。このトピックでは、ストップワード辞書を設定および使用する方法について説明します。
サポートされているバージョン
AnalyticDB for PostgreSQL V7.0 インスタンスのマイナーバージョンは V7.2.1.0 以降です。
AnalyticDB for PostgreSQL インスタンスのマイナーバージョンを表示する方法については、「インスタンスのマイナーバージョンを表示する」をご参照ください。AnalyticDB for PostgreSQL インスタンスが上記の要件を満たしていない場合は、インスタンスのマイナーバージョンを更新することをお勧めします。詳細については、「UpgradeDBVersion」をご参照ください。
ストップワード辞書を更新する
ストップワード辞書は pgsearch.stopword_dict テーブルに格納されています。テーブル内のデータを更新して、ストップワードを追加、削除、または変更できます。AnalyticDB for PostgreSQL インスタンスの jieba アナライザのデフォルト辞書の名前は default です。1 つのインスタンスに複数のストップワード辞書を作成できます。ストップワードを追加する場合は、辞書を指定する必要があります。default 以外の指定された辞書が存在しない場合は、新しい辞書が作成され、ストップワードが辞書に追加されます。指定された辞書が存在する場合は、ストップワードが辞書に追加されます。ストップワードを変更または削除するときに辞書を指定しない場合は、すべての辞書がスキャンされ、ストップワードが変更または削除されます。
デフォルト辞書のストップワードを追加、削除、または変更します。
-- 辞書名を指定して、デフォルト辞書にストップワードを追加します。 INSERT INTO pgsearch.stopword_dict(dict,word) VALUES('default', '的'); -- デフォルト辞書からストップワードを削除します。 DELETE FROM pgsearch.stopword_dict WHERE dict='default' AND word='的 '; -- デフォルト辞書のストップワードを変更します。 UPDATE pgsearch.stopword_dict SET word ='一个' WHERE dict='default' AND word ='的';user_stop_cn辞書のストップワードを追加、削除、または変更します。-- user_stop_cn 辞書にストップワードを追加します。 INSERT INTO pgsearch.stopword_dict(dict,word) VALUES('user_stop_cn', '的'); -- user_stop_cn 辞書からストップワードを削除します。 DELETE FROM pgsearch.stopword_dict WHERE dict='user_stop_cn' AND word='的'; -- user_stop_cn 辞書のストップワードを変更します。 UPDATE pgsearch.stopword_dict SET word ='一个' WHERE dict='user_stop_cn' AND word ='的';
辞書名列 dict とストップワード列 word は、テーブルの複合プライマリキーとして機能します。同じ辞書に重複するストップワードを追加することはできません。
辞書を読み込む
辞書を更新した後、SELECT pgsearch.reload_stopword_dict() 文を実行して、辞書をメモリに再読み込みする必要があります。この例では、user_stop_cn 辞書が読み込まれます。
SELECT pgsearch.reload_stopword_dict('user_stop_cn');辞書をメモリに読み込んだ後、辞書を既存のデータに反映させるには、次の手順を順番に実行する必要があります。
既存のデータベース接続を閉じて、再接続します。
辞書の更新は、テーブル内の既存のデータには影響しません。辞書を既存のデータに反映させるには、インデックスを再構築します。
辞書を使用してインデックスを作成する
BM25 インデックスを作成するときに、stopword パラメーターを使用して、jieba アナライザのストップワード辞書を指定できます。
CALL pgsearch.create_bm25(
index_name => '<index_name>',
table_name => '<table_name>',
text_fields => pgsearch.field('<column_name>', tokenizer=>pgsearch.tokenizer('jieba', SEARCH=>false, dict=>'<dict_name>', stopword=>'<stopword_dict_name>'))
);ストップワードフィルタリングの効果をクエリする
ストップワード辞書のセグメンテーション効果をクエリします。
SELECT pgsearch.tokenizer(pgsearch.tokenizer('jieba', stopword=>'user_stop_cn'), '同一个世界');