zhparser は、PostgreSQL 向けの中国語全文検索拡張機能です。中国語テキストを単語セグメントに分割(形態素解析)することで、PolarDB for PostgreSQL 上の中国語コンテンツに対してフルテキストインデックスを構築し、テキストクエリを実行できます。
zhparser の有効化
手順 1:拡張機能をインストールし、テキスト検索構成を作成します。
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;手順 2:(任意)セグメンテーションパラメーターを設定します。
ロールレベルでパラメーターを設定し、zhparser によるテキスト分割方法を制御できます。
| パラメーター | デフォルト | 説明 |
|---|---|---|
zhparser.multi_short | off | 短い単語を複合セグメントとして結合します |
すべてのロールに対して multi_short を有効化するには:
ALTER ROLE ALL SET zhparser.multi_short = on;手順 3:パーサーをテストします。
拡張機能が正しく動作しているかを確認するため、簡易テストを実行します。
SELECT * FROM ts_parse('zhparser', 'hello world! 2010年保障房建設在全国范围内获全面启动,从中央到地方纷纷加大了保障房的建设和投入力度。2011年,保障房进入了更大规模的建设阶段。住房城乡建设部党组书记、部长姜伟新去年底在全国住房城乡建设工作会议上表示,要继续推进保障性安居工程建设。');テキスト検索ベクターおよびクエリ関数を確認します。
SELECT to_tsvector('testzhcfg', '"今年保障房新开工数量虽然有所下调,但实际的年度在建规模以及竣工规模会超以往年份,相对应的对资金的需求也会创历史纪录。"陈国强说。在他看来,与2011年相比,2012年的保障房建设在资金配套上的压力将更为严峻。');
SELECT to_tsquery('testzhcfg', '保障房資金圧力');フルテキストインデックスの作成
高速な全文検索のために、中国語テキストに対して Generalized Inverted Index (GIN) を使用してインデックスを作成します。以下の例では、テーブル t1 の name 列に GIN インデックスを作成します。
-- GIN インデックスを作成
CREATE INDEX idx_t1 ON t1 USING gin (to_tsvector('zhcfg', upper(name)));
-- インデックスを使用してクエリを実行
SELECT * FROM t1 WHERE to_tsvector('zhcfg', upper(t1.name)) @@ to_tsquery('zhcfg', '(防火)');中国語の単語セグメンテーション辞書のカスタマイズ
デフォルト辞書には一般的な中国語単語が含まれています。業界用語やプロダクト名などのドメイン固有の用語については、pg_ts_custom_word にカスタム単語セグメントを追加してください。
手順 1:現在のセグメンテーション結果を確認します。
SELECT to_tsquery('testzhcfg', '保障房資金圧力');手順 2:カスタム単語セグメントを追加します。
INSERT INTO pg_ts_custom_word VALUES ('保障房資');手順 3:辞書を同期し、接続を再確立します。
SELECT zhprs_sync_dict_xdb();同期が完了したら、接続を一度閉じて再度開いてください。
\c手順 4:新しいセグメンテーション結果を確認します。
SELECT to_tsquery('testzhcfg', '保障房資金圧力');制限事項
| 制限項目 | 値 | 超過時の動作 |
|---|---|---|
| カスタム単語セグメント数 | 1,000,000 | 制限を超えた単語セグメントは無視されます |
| 単語セグメントの長さ | 128 バイト | 128 バイトを超える部分は切り捨てられます |
カスタム辞書とデフォルト辞書は同時に有効になります。
単語セグメントに対して追加・削除・更新を行った後は、変更を反映するために SELECT zhprs_sync_dict_xdb(); を実行し、接続を再確立する必要があります。