PostgreSQL の組み込みフルテキスト検索はアルファベットベースの言語をサポートしますが、中国語テキストの形態素解析には対応していません。pg_jieba はこのギャップを埋める拡張機能であり、中国語テキストを検索可能なレクセム(語彙単位)に分割することで、PolarDB for PostgreSQL における中国語コンテンツのフルテキスト検索を実現します。
サポートされるバージョン
pg_jieba は、以下のバージョンで実行中の PolarDB for PostgreSQL クラスターで利用可能です。
PostgreSQL 15(リビジョンバージョン 15.7.2.0 以降)
PostgreSQL 14(リビジョンバージョン 14.5.2.0 以降)
PostgreSQL 11(リビジョンバージョン 1.1.28 以降)
現在のリビジョンバージョンを確認するには:
PostgreSQL 15 および 14 の場合:
SELECT version();PostgreSQL 11 の場合:
SHOW polar_version;
仕組み
pg_jieba は 3 種類のテキスト検索構成を提供します。各構成は異なる形態素解析戦略を採用し、それぞれ異なる検索シナリオに最適化されています。
| 構成 | モード | 推奨用途 |
|---|---|---|
jiebacfg | 正確モード | インデックス作成向け。冗長な部分語を含まず、最も正確な語彙単位の集合にテキストを分割します。 |
jiebaqry | 全モード | クエリにおける再現率の最大化向け。すべての可能な語の組み合わせ(部分語を含む)を抽出します。 |
jiebacfg_pos | 位置付き正確モード | 各トークンについて文字オフセット位置が必要な場合に使用します。また、正確モードでは除外されるストップワードも含みます。 |
正確モードと全モードの選択基準: フルテキストインデックス作成の大部分のケースでは、より少ない数で精度の高いトークンを返す jiebacfg を使用してください。一方、検索ヒットの見落としがノイズ除去よりも重大な場合は、すべての可能な部分語を返す jiebaqry を使用してください。これにより再現率は向上しますが、重複マッチが発生する可能性があります。
拡張機能の有効化および無効化
これらの文を実行できるのは特権アカウントのみです。
pg_jieba 拡張機能を作成するには、以下のコマンドを実行します。
CREATE EXTENSION pg_jieba;削除するには:
DROP EXTENSION pg_jieba;中国語テキストの形態素解析
3 種類の構成すべてが標準関数 to_tsvector と連携して動作します。構成名は第 1 引数として指定します。
例 1 — 入力: '小明硕士毕业于中国科学院计算所,后在日本京都大学深造'
正確モード(jiebacfg):
SELECT * FROM to_tsvector('jiebacfg', '小明硕士毕业于中国科学院计算所,后在日本京都大学深造'); to_tsvector
----------------------------------------------------------------------------------
'中国科学院':5 '小明':1 '日本京都大学':10 '毕业':3 '深造':11 '硕士':2 '计算所':6
(1 row)全モード(jiebaqry) — '中国'、'学院'、'科学' などの部分語を含む、より多くのトークンを返します。
SELECT * FROM to_tsvector('jiebaqry', '小明硕士毕业于中国科学院计算所,后在日本京都大学深造'); to_tsvector
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
'中国':5 '中国科学院':9 '京都':16 '大学':17 '学院':7 '小明':1 '日本':15 '日本京都大学':18 '毕业':3 '深造':19 '硕士':2 '科学':6 '科学院':8 '計算':10 '計算所':11
(1 row)位置付き正確モード(jiebacfg_pos) — '于'、'后'、'在' などのストップワードと文字オフセットを含みます。
SELECT * FROM to_tsvector('jiebacfg_pos', '小明硕士毕业于中国科学院计算所,后在日本京都大学深造'); to_tsvector
------------------------------------------------------------------------------------------------------------------------------------------
'中国科学院:7':5 '于:6':4 '后:16':8 '在:17':9 '小明:0':1 '日本京都大学:18':10 '毕业:4':3 '深造:24':11 '硕士:2':2 '计算所:12':6 ',:15':7
(1 row)例 2 — 入力: '李小福是创新办主任也是云计算方面的专家'
正確モード(jiebacfg):
SELECT * FROM to_tsvector('jiebacfg', '李小福是创新办主任也是云计算方面的专家'); to_tsvector
-------------------------------------------------------------------
'专家':11 '主任':5 '云计算':8 '创新':3 '办':4 '方面':9 '李小福':1
(1 row)全モード(jiebaqry) — '计算' を '云计算' の部分語として返します。
SELECT * FROM to_tsvector('jiebaqry', '李小福是创新办主任也是云计算方面的专家'); to_tsvector
-----------------------------------------------------------------------------
'专家':12 '主任':5 '云计算':9 '创新':3 '办':4 '方面':10 '李小福':1 '计算':8
(1 row)位置付き正確モード(jiebacfg_pos) — '是'、'也'、'的' などのストップワードとそのオフセットを含みます。
SELECT * FROM to_tsvector('jiebacfg_pos', '李小福是创新办主任也是云计算方面的专家'); to_tsvector
---------------------------------------------------------------------------------------------------------------------------
'专家:17':11 '主任:7':5 '也:9':6 '云计算:11':8 '创新:4':3 '办:6':4 '方面:14':9 '是:10':7 '是:3':2 '李小福:0':1 '的:16':10
(1 row)カスタム辞書の使用
pg_jieba は複数のカスタム辞書をサポートしています。ドメイン固有の用語をカスタム辞書に登録することで、コンテンツの形態素解析精度を向上させることができます。
カスタム辞書を使用する前に、pg_jieba を shared_preload_libraries パラメーターに追加してください。この設定はコンソールから行います — 「」をご参照ください。設定を保存すると、クラスターが再起動します。
以下の例では、カスタム辞書の導入が形態素解析結果に与える影響を示します。カスタム辞書がない状態では、'阿里云' および '研发工程师' が部分語に分割されますが、カスタム辞書を読み込んだ後は、それぞれ単一のトークンとして扱われます。
最初のカスタム辞書(インデックス
0、重み10)に用語を挿入します。INSERT INTO jieba_user_dict VALUES ('阿里云'); INSERT INTO jieba_user_dict VALUES ('研发工程师', 0, 10);組み込み辞書による形態素解析を確認します(この時点ではカスタム辞書は有効になっていません)。
SELECT * FROM to_tsvector('jiebacfg', 'zth是阿里云的一个研发工程师');to_tsvector ------------------------------------------------------ 'zth':1 '一个':6 '云':4 '工程师':8 '研发':7 '阿里':3 (1 row)'阿里云'が'阿里'と'云'に、'研发工程师'が'研发'と'工程师'に分割されていることがわかります。カスタム辞書
0に切り替えます。SELECT jieba_load_user_dict(0);jieba_load_user_dict ---------------------- (1 row)同じクエリを再度実行します。カスタム用語が単一のトークンとして認識されるようになりました。
SELECT * FROM to_tsvector('jiebacfg', 'zth是阿里云的一个研发工程师');to_tsvector -------------------------------------------- 'zth':1 '一个':5 '研发工程师':6 '阿里云':3 (1 row)
次のステップ
クラスターパラメーターの指定 —
shared_preload_librariesを設定して、カスタム辞書を有効にします