製品名、法務用語、業界特有の専門用語などのドメイン固有の用語は、汎用トークナイザーによって不適切に分割されることが多く、その結果、BM25 フルテキスト検索で関連性のある検索結果が見過ごされたり、誤った順位付けが行われたりします。AnalyticDB for PostgreSQL の Jieba トークナイザーでは、カスタム単語分割辞書をサポートしており、専門的な語彙を追加することで、これらの用語を単一のトークンとして扱うようにトークナイザーを調整できます。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
AnalyticDB for PostgreSQL V7.0 インスタンス(マイナーバージョン V7.2.1.0 以降)。マイナーバージョンを確認するには、「インスタンスのマイナーバージョンを表示する」をご参照ください。スペックアップするには、「UpgradeDBVersion」をご参照ください。
ご利用のインスタンスに pgsearch 拡張がインストール済みであること。インストール手順については、「BM25 パフォーマンス専有型フルテキスト検索」の「インストールおよびアンインストール」セクションをご参照ください。
制限事項
カスタム辞書をサポートするのは Jieba トークナイザーのみです。
仕組み
カスタム辞書は pgsearch.jieba_custom_word テーブルに格納されます。dict 列と word 列は複合プライマリキーを構成するため、同一辞書内での重複する単語セグメントは許可されません。デフォルト辞書の名前は default です。
単語セグメントを追加する際の動作は以下のとおりです。
辞書名を指定しない場合、単語は
default辞書に追加されます。指定した辞書が存在しない場合、自動的に新しい辞書が作成されます。
指定した辞書が既に存在する場合、単語はその辞書に追加されます。
辞書名を指定せずに単語セグメントを更新または削除する場合、すべての辞書がスキャンされます。
辞書エントリの管理
デフォルト辞書へのエントリの追加、更新、削除
-- デフォルト辞書への単語追加(暗黙的)
INSERT INTO pgsearch.jieba_custom_word(word) VALUES('永和服装饰品');
-- デフォルト辞書への単語追加(明示的)
INSERT INTO pgsearch.jieba_custom_word(dict, word) VALUES('default', '永和服装饰品');
-- デフォルト辞書内の単語の更新
UPDATE pgsearch.jieba_custom_word SET word = '永和' WHERE dict = 'default' AND word = '永和服装饰品';
-- デフォルト辞書からの単語の削除
DELETE FROM pgsearch.jieba_custom_word WHERE dict = 'default' AND word='永和服装饰品';カスタム辞書へのエントリの追加、更新、削除
-- カスタム辞書への単語追加(存在しない場合は自動的に作成)
INSERT INTO pgsearch.jieba_custom_word(dict, word) VALUES('custom_dict', '永和服装饰品');
-- カスタム辞書内の単語の更新
UPDATE pgsearch.jieba_custom_word SET word = '永和' WHERE dict = 'custom_dict' AND word = '永和服装饰品';
-- カスタム辞書からの単語の削除
DELETE FROM pgsearch.jieba_custom_word WHERE dict = 'custom_dict' AND word='永和服装饰品';辞書の読み込み
pgsearch.jieba_custom_word テーブルのエントリを更新した後は、辞書をメモリに再読み込みします。
SELECT pgsearch.reload_user_dict('custom_dict');再読み込みは、既存のインデックス化済みデータには自動的に適用されません。更新された辞書を既存のデータに適用するには、以下の手順を順に実行してください。
既存のデータベース接続を終了し、再度確立します。
該当の辞書を使用するテーブルのインデックスを再構築します。
カスタム辞書を指定した BM25 インデックスの作成
pgsearch.create_bm25() を呼び出す際に、カスタム辞書を指定します。
単一カラムの場合:
CALL pgsearch.create_bm25(
index_name => '<index_name>',
table_name => '<table_name>',
text_fields => pgsearch.field('<column_name>', tokenizer=>pgsearch.tokenizer('jieba', dict=>'<dict_name>'))
);異なる辞書を指定した複数カラムの場合:
CALL pgsearch.create_bm25(
index_name => '<index_name>',
table_name => '<table_name>',
text_fields => pgsearch.field('<column1_name>', tokenizer=>pgsearch.tokenizer('jieba', hmm=>false, SEARCH=>false, dict=>'<dict_name>'))
|| pgsearch.field('<column2_name>', tokenizer=>pgsearch.tokenizer('jieba', hmm=>false, SEARCH=>false, dict=>'<dict2_name>'))
);プレースホルダーを実際の値に置き換えてください。
| プレースホルダー | 説明 |
|---|---|
<index_name> | 作成する BM25 インデックスの名前 |
<table_name> | インデックス化するテーブルの名前 |
<column_name> | インデックス化するカラムの名前 |
<dict_name> | カスタム辞書の名前 |
<dict2_name> | 2 番目のカラム用のカスタム辞書の名前 |
単語分割効果の検証
pgsearch.tokenizer() を使用して、Jieba トークナイザーがカスタム辞書を用いてテキストをどのように分割するかを確認できます。これにより、インデックス作成前に単語分割の問題を検出できます。
たとえば、永和服装饰品 を custom_dict に追加した後、トークナイザーがこれを単一のトークンとして処理することを検証できます。
SELECT pgsearch.tokenizer(pgsearch.tokenizer('jieba', hmm=>false, SEARCH=>false, dict=>'custom_dict'), '永和服装饰品有限公司');pgsearch.tokenizer() のパラメーターについて詳しくは、「BM25 パフォーマンス専有型フルテキスト検索」の「パラメーター」セクションをご参照ください。
次のステップ
BM25 パフォーマンス専有型全文検索 — インデックスの作成、検索クエリ、およびトークナイザーのパラメーターを含む完全な使用ガイド