すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:中国語形態素解析 (zhparser)

最終更新日:Mar 29, 2026

zhparser 拡張は、ApsaraDB RDS for PostgreSQL における中国語のフルテキスト検索を可能にします。英語と異なり、中国語のテキストには単語間に空白が存在しないため、PostgreSQL の組み込みパーサでは正確な分割が行えません。zhparser はセマンティクスに基づいて中国語テキストを分割し、正確なフルテキストインデックス作成および検索を実現します。

前提条件

開始する前に、以下の点を確認してください。

  • RDS インスタンスで PostgreSQL 10 以降が実行されていること

  • マイナーエンジンバージョンが 20230830 以降であること。PostgreSQL 17 の場合、マイナーエンジンバージョンは 20241030 以降である必要があります

  • zhparser がインスタンスの shared_preload_libraries パラメーターに追加されていること。手順については、「ApsaraDB RDS for PostgreSQL インスタンスのパラメーターの変更」をご参照ください

重要

新規および再作成された拡張は、マイナーエンジンバージョン 20230830 以降を必要とします。インスタンスがそれより前のバージョンを実行している場合は、拡張を作成する前に更新してください。「マイナーエンジンバージョンの更新」をご参照ください。拡張がすでに以前のバージョンにインストール済みの場合、引き続き動作します。詳細については、「[製品変更/機能変更] ApsaraDB RDS for PostgreSQL インスタンスにおける pg-cron 拡張の作成制限」をご参照ください。

zhparser の有効化

以下の文を実行して、拡張機能を作成し、testzhcfg という名前のテキスト検索構成を設定します。

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;
-- オプション:より細かい分割のため、短単語の複合化を有効化
ALTER ROLE CURRENT_ROLE SET zhparser.multi_short=on;

ADD MAPPING FOR n,v,a,i,e,l 行では、6 つの主要トークンタイプ(nvaiel)を simple 辞書にマップします。

分割結果の検証

PostgreSQL のフルテキスト検索では、以下の 3 つの主要関数が使用されます。

関数目的入力例 → 出力例
ts_parse()トークンタイプ ID を含む生のトークン出力を返すパーサからの生トークン
to_tsvector()テキストを正規化されたレクシームに変換し、インデックス作成に使用するテキスト → インデックス用レクシームリスト
to_tsquery()フレーズをクエリ式に変換するフレーズ → tsvector

zhparser によるテキスト分割が正しく行われていることを確認するには、以下のテストクエリを実行します。

-- 生トークン出力のテスト
-- tokid はトークンタイプを識別する ID
SELECT * FROM ts_parse('zhparser', 'hello world! 2010年保障房建設在全国範囲内獲全面啟動,從中央到地方紛紛加大 了 保 障 房 的 建 設 和 投 入 力 度 。 2011年,保障房進入了更大規模的建設階段。 住房城鄉建設部黨組書記、部長姜偉新去年底在全国住房城鄉建設工作會議上表示,要繼續推進保障性安居工程建設。 ');

-- テキストをインデックス作成に使用する正規化されたレクシームリスト (tsvector) に変換
SELECT to_tsvector('testzhcfg','"今年保障房新開工數量雖然有所下調,但實際的年度在建規模以及竣工規模會超以往年份,相對應的對資金的需求也會創歷史紀錄。"陳國強說。 在他看來,與2011年相比,2012年的保障房建設在資金配套上的壓力將更為嚴峻。 ');

-- 検索フレーズを @@ 演算子で使用可能な tsquery に変換
SELECT to_tsquery('testzhcfg', '保障房資金壓力');

フルテキストインデックスの作成とクエリ実行

zhparser を有効化した後、検索対象の列に GIN (Generalized Inverted Index) インデックスを作成します。以下の例では、テーブル t1name 列にフルテキストインデックスを作成します。

-- t1 および name を実際のテーブル名および列名に置き換えてください
CREATE INDEX idx_t1 ON t1 USING gin (to_tsvector('testzhcfg', upper(name)));

@@ 演算子を使用して、検索クエリに対して行を照合します。

SELECT * FROM t1 WHERE to_tsvector('testzhcfg', upper(t1.name)) @@ to_tsquery('testzhcfg', '(防火)');
説明

インデックスと WHERE 句で使用する式は同一である必要があります — すなわち to_tsvector('testzhcfg', upper(name)) — これにより、PostgreSQL はクエリ実行時にインデックスを活用できます。

カスタム単語セグメントの追加

組み込み辞書で正しく分割されないドメイン固有の用語を追加するには、pg_ts_custom_word に挿入します。

以下の例では、保障房資 を単一の単語セグメントとして追加します。

-- 現在の分割結果を確認
SELECT to_tsquery('testzhcfg', '保障房資金壓力');

-- 新しい単語セグメントを追加
INSERT INTO pg_ts_custom_word VALUES ('保障房資');

-- 変更を反映させるために辞書を同期
SELECT zhprs_sync_dict_xdb();

-- データベースへの再接続(新しいセッションで更新された辞書が有効になります)
\c

-- 新しい分割結果を確認
SELECT to_tsquery('testzhcfg', '保障房資金壓力');
説明

単語セグメントの追加、削除、変更後は、変更を有効化するために必ず zhprs_sync_dict_xdb() を呼び出し、データベースへ再接続する必要があります。既存のセッションには変更が適用されません。

カスタム辞書の制限事項

制限事項
カスタム単語セグメントの最大数1,000,000
単語セグメントあたりの最大長128 バイト

単語セグメント数が 1,000,000 を超える場合、上限を超えたセグメントは無視されます。128 バイトを超える単語セグメントは、128 バイト目で切り捨てられます。

カスタム辞書と組み込み辞書は同時に有効です。