このトピックでは、zhparser拡張機能を使用して、ApsaraDB RDS for PostgreSQLインスタンスで中国語のフルテキスト検索を実行する方法について説明します。
前提条件
RDSインスタンスはPostgreSQL 10以降を実行します。
RDSインスタンスは、20230830以降のマイナーエンジンバージョンを実行します。
重要この拡張機能は、20230830以前の一部のマイナーエンジンバージョンでサポートされています。 ただし、ApsaraDB RDSは、標準化された拡張機能管理とセキュリティ強化のために、マイナーエンジンバージョンの更新で脆弱な拡張機能を最適化する予定です。 したがって、20230830より前のマイナーエンジンバージョンを実行するRDSインスタンスでは、この拡張機能を作成することはできません。 詳細については、「 [製品の変更 /機能の変更] ApsaraDB RDS For PostgreSQLインスタンスの拡張機能作成の制限」をご参照ください。
20230830より前のマイナーエンジンバージョンを実行するRDSインスタンス用にこの拡張機能を既に作成している場合は、引き続きこの拡張機能を使用できます。
このエクステンションを初めて作成する場合、またはRDSインスタンスのエクステンションを再作成する必要がある場合は、RDSインスタンスのマイナーエンジンバージョンを最新バージョンに更新する必要があります。 詳細については、「マイナーエンジンバージョンの更新」をご参照ください。
zhparserは、RDSインスタンスのshared_preload_librariesパラメーターの値に追加されます。
zhparser拡張子の名前をshared_preload_librariesパラメーターの値に追加する方法の詳細については、「ApsaraDB RDS For PostgreSQLインスタンスのパラメーターの変更」をご参照ください。
背景情報
オープンソースのPostgreSQLは、英語などの言語でテキストをセグメント化できる組み込みのパーサー拡張機能を提供します。 ただし、中国語のテキストには単語間にスペースがなく、セマンティクスに基づいてセグメント化する必要があり、テキストの長さは固定されていません。 したがって、中国語でテキストをセグメント化するには、パーサー拡張ではなくzhparser拡張を使用することをお勧めします。
PostgreSQLのzhparser拡張機能は、テキストを中国語でセグメント化できます。 RDSインスタンスにzhparser拡張機能をインストールした後、RDSインスタンスで中国語の全文検索を実行できます。
zhparser拡張を有効にする
次のステートメントを実行して、zhparser拡張機能を有効にします。
CREATE EXTENSION zhparser;
CREATE TEXT SEARCH CONFIGURATION testzhcfg (PARSER = zhparser);
ALTER TEXT SEARCH CONFIGURATION testzhcfg ADD MAPPING FOR n,v,a,i,e,l WITH simple;
--Optional parameter configuration
ALTER ROLE CURRENT_ROLE SET zhparser.multi_short=on;
--Simple test
SELECT * FROM ts_parse('zhparser', 'hello world! 2010年保障房建设在全国范围内获全面启动,从中央到地方纷纷加大 了 保 障 房 的 建 设 和 投 入 力 度 。 2011年,保障房进入了更大规模的建设阶段。 住房城乡建设部党组书记、部长姜伟新去年底在全国住房城乡建设工作会议上表示,要继续推进保障性安居工程建设。 ');
SELECT to_tsvector('testzhcfg','“今年保障房新开工数量虽然有所下调,但实际的年度在建规模以及竣工规模会超以往年份,相对应的对资金的需求也会创历史纪录。”陈国强说。 在他看来,与2011年相比,2012年的保障房建设在资金配套上的压力将更为严峻。 ');
SELECT to_tsquery('testzhcfg', '保障房资金压力');
次のステートメントを実行して、zhparser拡張機能でフルテキスト検索を実行できるようにします。
-- Create a full-text index for the name field of the t1 table. You must replace t1 and name in the SQL statements with the actual table name and field value based on your business requirements.
CREATE index idx_t1 ON t1 using gin (to_tsvector('testzhcfg',upper(name) ));
-- Use the full-text index.
SELECT * FROM t1 WHERE to_tsvector('testzhcfg',upper(t1.name)) @@ to_tsquery('testzhcfg','(防火)');
中国語の単語分割辞書のカスタマイズ
次の文を実行して、中国語の単語分割辞書をカスタマイズします。
-- The segmentation result
SELECT to_tsquery('testzhcfg', '保障房资金压力');
-- Insert a new word segment to the dictionary
INSERT INTO pg_ts_custom_word VALUES ('保障房资');
-- Make the inserted word segment effective
SELECT zhprs_sync_dict_xdb();
-- End the connection
\c
-- Requery to obtain new segmentation results
SELECT to_tsquery('testzhcfg', '保障房资金压力');
カスタム単語セグメントの使用について
最大 100 万のカスタム単語セグメントを追加できます。 単語セグメントの数が制限を超えた場合、制限外の単語セグメントは処理されません。 単語セグメントの数がこの範囲内であることを確認してください。 カスタムおよびデフォルトの単語分割辞書が同時に有効になります。
各単語セグメントは、最大 128 バイトである必要があります。 128 バイト以降のセクションは切り捨てられます。
単語セグメントを追加、削除、または変更した後、
SELECT zhprs_sync_dict_xdb();
ステートメントを実行し、接続を再確立して操作を有効にします。