ストップワードとは、「の」「は」「the」など、検索価値が低く、高頻度で出現する一般的な語です。ストップワード省略を適用しない場合、検索クエリ「同一个世界」に対してすべてのトークンが同等に扱われます。ストップワードを構成することで、Jieba トークナイザーは文書を区別する重要な語にフォーカスし、BM25 検索の関連性およびクエリ実行性能を向上させます。
pgsearch 拡張には、中国語向けの組み込みストップワード辞書 CN_SIMPLE と英語向けの EN_SIMPLE の 2 つが含まれています。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
AnalyticDB for PostgreSQL V7.0 インスタンスがマイナーバージョン V7.2.1.0 以降で実行中であること
インスタンスのマイナーバージョンを確認するには、「インスタンスのマイナーバージョンを表示する」をご参照ください。スペックアップするには、「UpgradeDBVersion」をご参照ください。
ストップワードの管理
ストップワード辞書は、pgsearch.stopword_dict テーブルに格納されます。dict 列には辞書名が、word 列にはストップワードが格納されます。これら 2 つの列は複合プライマリキーを構成するため、同一辞書内での重複したストップワードは許可されません。
Jieba トークナイザーはデフォルトで default という名前の辞書を使用します。1 つのインスタンスには複数のストップワード辞書を設定できます。
ストップワードの追加
ストップワードを追加する際は、必ず辞書名を指定してください。指定された辞書が存在しない場合(常に存在する default を除く)、pgsearch が自動的に該当辞書を作成し、その中にストップワードを追加します。
デフォルト 辞書にストップワードを追加します:
INSERT INTO pgsearch.stopword_dict(dict, word) VALUES('default', '的');カスタム辞書 user_stop_cn にストップワードを追加します:
INSERT INTO pgsearch.stopword_dict(dict, word) VALUES('user_stop_cn', '的');ストップワードの更新
「default」辞書内のストップワードを更新します:
UPDATE pgsearch.stopword_dict SET word = '一个' WHERE dict = 'default' AND word = '的';user_stop_cn 辞書内のストップワードを更新します:
UPDATE pgsearch.stopword_dict SET word = '一个' WHERE dict = 'user_stop_cn' AND word = '的';ストップワードの削除
default 辞書からストップワードを削除します:
DELETE FROM pgsearch.stopword_dict WHERE dict = 'default' AND word = '的';user_stop_cn 辞書からストップワードを削除する:
DELETE FROM pgsearch.stopword_dict WHERE dict = 'user_stop_cn' AND word = '的';UPDATE 文または DELETE 文で dict フィルターを省略すると、pgsearch はすべての辞書をスキャンし、該当するすべてのストップワードを変更します。
辞書の再読み込み
辞書を更新した後は、メモリへ再読み込みしてください。
SELECT pgsearch.reload_stopword_dict('user_stop_cn');辞書の再読み込みでは、既存のインデックス済みデータは自動的に更新されません。新しいストップワード構成を既存データに適用するには、以下の手順を順に実行してください。
すべての既存データベース接続を終了し、再接続します。
影響を受けるテーブルのインデックスを再構築します。
ストップワード辞書を指定した BM25 インデックスの作成
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>'))
);プレースホルダーを実際の値に置き換えてください。
| プレースホルダー | 説明 | 例 |
|---|---|---|
<index_name> | 作成する BM25 インデックスの名前 | my_bm25_index |
<table_name> | インデックス対象のテーブル | articles |
<column_name> | インデックス対象のテキストカラム | content |
<dict_name> | Jieba 分かち書き用辞書 | default |
<stopword_dict_name> | 適用するストップワード辞書 | user_stop_cn |
ストップワード省略の確認
以下のクエリを実行して、ストップワードが正しく省略されていることを確認します。この例では、入力文字列 同一个世界 に対して user_stop_cn 辞書が使用されています。
SELECT pgsearch.tokenizer(pgsearch.tokenizer('jieba', stopword => 'user_stop_cn'), '同一个世界');