全文検索のプロセスでは、単語分割の精度は検索結果に不可欠です。一般的なアナライザは基本的なサポートのみを提供しており、専門分野や業界の固有の要件を満たしていないことがよくあります。たとえば、法的文書を扱う場合、「不可抗力」や「契約履行」などの専門用語は一般語彙に含まれていない可能性があります。その結果、検索結果に偏りが生じたり、重要な情報が失われたりする可能性があります。単語分割が正確でない場合、返される結果はユーザーのクエリ意図に完全には対応できず、ユーザーエクスペリエンスに影響を与えます。
単語分割の精度と取得効率を高めるために、jieba アナライザではカスタム単語分割辞書を設定できます。業界または特定の アプリケーションシナリオ の要件に基づいて、固有名詞、業界用語、トレンドワードを辞書に追加して、実際の要件により適した単語分割を実装できます。このトピックでは、カスタム単語分割辞書を設定および使用する方法について説明します。
サポートされているバージョン
AnalyticDB for PostgreSQL V7.0 インスタンスのマイナーバージョンは V7.2.1.0 以降です。
AnalyticDB for PostgreSQL インスタンスのマイナーバージョンを表示する方法については、「インスタンスのマイナーバージョンを表示する」をご参照ください。AnalyticDB for PostgreSQL インスタンスが上記の要件を満たしていない場合は、インスタンスのマイナーバージョンを更新することをお勧めします。詳細については、「UpgradeDBVersion」をご参照ください。
前提条件
pgsearch エクステンションが AnalyticDB for PostgreSQL インスタンスにインストールされています。 pgsearch エクステンションのインストール方法については、「BM25 パフォーマンス専有型全文検索」トピックの「インストールとアンインストール」セクションをご参照ください。
制限事項
jieba アナライザのみがカスタム辞書をサポートしています。
辞書を更新する
jieba アナライザの辞書は pgsearch.jieba_custom_word テーブルに格納されています。テーブル内のデータを更新して、単語セグメントを追加、削除、または変更できます。AnalyticDB for PostgreSQL の jieba アナライザのデフォルト辞書の名前は default です。1 つのインスタンスに複数のカスタム辞書を作成できます。単語セグメントを追加するときに辞書が指定されていない場合は、デフォルト辞書が更新されます。default 以外の指定された辞書が存在しない場合は、新しい辞書が作成され、単語セグメントが辞書に追加されます。指定された辞書が存在する場合は、単語セグメントが辞書に追加されます。単語セグメントを変更または削除するときに辞書を指定しないと、すべての辞書がスキャンされて単語セグメントが変更または削除されます。
デフォルト辞書のカスタム単語セグメントを追加、削除、または変更します。
-- 辞書名を指定せずに、カスタム単語セグメントをデフォルト辞書に追加します。 INSERT INTO pgsearch.jieba_custom_word(word) VALUES('永和服装饰品'); -- 辞書名を指定して、カスタム単語セグメントをデフォルト辞書に追加します。 INSERT INTO pgsearch.jieba_custom_word(dict, word) VALUES('default', '永和服装饰品'); -- デフォルト辞書からカスタム単語セグメントを削除します。 DELETE FROM pgsearch.jieba_custom_word WHERE dict = 'default' AND word='永和服装饰品'; -- デフォルト辞書のカスタム単語セグメントを変更します。 UPDATE pgsearch.jieba_custom_word SET word = '永和' WHERE dict = 'default' AND word = '永和服装饰品';カスタム辞書のカスタム単語セグメントを追加、削除、または変更します。
-- custom_dict 辞書にカスタム単語セグメントを追加します。 INSERT INTO pgsearch.jieba_custom_word(dict, word) VALUES('custom_dict', '永和服装饰品'); -- custom_dict 辞書からカスタム単語セグメントを削除します。 DELETE FROM pgsearch.jieba_custom_word WHERE dict = 'custom_dict' AND word='永和服装饰品'; -- custom_dict 辞書のカスタム単語セグメントを変更します。 UPDATE pgsearch.jieba_custom_word SET word = '永和' WHERE dict = 'custom_dict' AND word = '永和服装饰品';
辞書名列 dict とカスタム単語セグメント列 word は、テーブルの複合プライマリキーとして機能します。同じ辞書に重複したカスタム単語セグメントを追加することはできません。
辞書を読み込む
pgsearch.jieba_custom_word テーブルの辞書を更新した後、SELECT pgsearch.reload_user_dict() 文を実行して、辞書をメモリに再読み込みする必要があります。この例では、custom_dict 辞書が読み込まれます。
SELECT pgsearch.reload_user_dict('custom_dict');辞書をメモリに読み込んだ後、カスタム辞書を既存のデータに反映させるには、次の手順を順番に実行する必要があります。
既存のデータベース接続を閉じて、再接続します。
辞書の更新は、テーブル内の既存のデータには影響しません。辞書を既存のデータに反映させるには、インデックスを再構築します。
辞書を使用してインデックスを作成する
BM25 インデックスを作成するときに、jieba アナライザのカスタム単語分割辞書を指定できます。
テーブルの列に辞書を指定します。
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>')) );
カスタム辞書の単語分割効果をクエリする
pgsearch.tokenizer() 関数を使用して jieba アナライザのカスタム単語分割辞書を指定し、カスタム辞書の単語分割効果をクエリできます。 pgsearch.tokenizer() 関数の詳細については、「BM25 パフォーマンス専有型全文検索」トピックの「パラメータ」セクションをご参照ください。
カスタム辞書の単語分割効果をクエリします。
SELECT pgsearch.tokenizer(pgsearch.tokenizer('jieba', hmm=>false, SEARCH=>false, dict=>'custom_dict'), '永和服装饰品有限公司');