ServBayでpg_jiebaを利用したPostgreSQL中国語全文検索 
概要 
英語などの言語の場合、PostgreSQLの組み込み全文検索機能はスペースや句読点による字句解析(lexical analysis)で効果的に機能します。しかし中国語テキストには自然な単語区切りが存在しないため、**単語分割(セグメンテーション)**専用のツールが必要です。これにより、連続した漢字列を意味単位の単語に分割することができます。
pg_jiebaはPostgreSQL用のサードパーティ拡張モジュールで、人気のある**Jieba(結巴分詞)**中国語分かち書きライブラリを統合しています。pg_jiebaを活用することで、PostgreSQL上で中国語テキストを効率的かつ正確に分かち書き処理でき、高度な中国語全文検索機能を構築できます。
ServBayは統合型ローカルWeb開発環境であり、pg_jieba拡張があらかじめ組み込まれているため、面倒なコンパイルやインストール作業なしにローカルで中国語全文検索機能の開発・テストをスムーズに始められます。
この記事では、ServBay環境上でpg_jieba拡張の有効化、設定、利用方法を詳しく解説します。
前提条件 
pg_jiebaを利用する前に、以下の準備を済ませてください。
- macOSシステムにServBayがインストールされており、PostgreSQLデータベースが正常に稼働していること
 - PostgreSQLデータベースへの接続やSQL文の実行といった基本操作を理解していること
 
pg_jiebaのインストールと有効化 
ServBayにはPostgreSQLとともにpg_jieba拡張モジュールが同梱されています。ユーザーは手動でダウンロードやコンパイルを行う必要はなく、対象データベース内でSQLコマンドを実行するだけで簡単に有効化できます。
pg_jieba拡張の有効化手順は以下の通りです。
PostgreSQLデータベースへ接続 ターミナルアプリを開き、
psqlコマンドラインツールを用いてPostgreSQLデータベースに接続します。your_usernameはPostgreSQLのユーザー名、your_databaseはデータベース名に置き換えて下さい。ServBayのデフォルトユーザーおよびデータベース名は通常servbayまたはpostgresです。bashpsql -U your_username -d your_database1例:デフォルトのユーザーとデータベースを使用する場合
bashpsql -U servbay -d servbay1pg_jieba拡張の作成と有効化psqlコマンドラインで、次のSQL文を実行します。sqlCREATE EXTENSION pg_jieba;1既に拡張が作成済みの場合はエラーが表示されますが、問題ありません。
pg_jieba拡張が有効化されているか確認 インストール済み拡張一覧を表示します。sql\dx1一覧に
pg_jiebaが表示されていれば有効化されています。
pg_jiebaによる中国語全文検索の設定 
pg_jieba拡張を有効化した後は、PostgreSQLのテキスト検索(Text Search)機能を設定し、分かち書き用パーサとしてpg_jiebaを使うように指定します。
テキスト検索構成(Text Search Configuration)の設定 
テキスト検索構成は、どのパーサを使ってどのように文書を分割・解析し、各トークン(語)をどの辞書で処理するかを定めるものです。
新しいテキスト検索構成の作成
chineseという名前で新たなテキスト検索構成を作成し、パーサとしてpg_jiebaを指定します。sqlCREATE TEXT SEARCH CONFIGURATION chinese (PARSER = pg_jieba);1この設定によりPostgreSQLはテキスト処理の際に
pg_jiebaで分かち書きを行います。分割結果のマッピングを追加
pg_jiebaパーサは品詞(part of speech)ごとにさまざまなトークンタイプを出力します。これらトークンをインデックス・検索対象にするには、特定の辞書(dictionary)へのマッピングが必要です。ここでは名詞(n)、動詞(v)、形容詞(a)など一般的な品詞をPostgreSQL内蔵のsimple辞書へマッピングします。simple辞書はトークン変換を行わず、パーサの出力をそのまま利用します。sqlALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR n,v,a,i,e,l WITH simple;1ここでの
n,v,a,i,e,lはpg_jiebaが認識しうる品詞タグの一部です。必要に応じて追加・修正できます。代表的なタグは以下の通りです。n: 名詞v: 動詞a: 形容詞i: 成語・イディオムe: 感嘆詞l: 慣用表現nr: 人名ns: 地名nt: 組織名nz: その他固有名詞m: 数詞q: 量詞t: 時間詞s: 場所詞f: 方位詞p: 前置詞c: 接続詞u: 助詞xc: その他の虚詞w: 句読点eng: 英単語x: 非語素文字
通常、意味を持つ名詞・動詞・形容詞などを中心に索引・検索対象とします。
pg_jiebaを使った全文検索の例 
設定を終えたら、実際にpg_jiebaを用いた中国語全文検索が可能になります。以下に基本的な例を示します。
サンプルテーブルとデータの作成 
まず、文書を格納するテーブルを作り、中国語テキストを挿入します。
テーブルの作成
sqlCREATE TABLE documents ( id SERIAL PRIMARY KEY, content TEXT );1
2
3
4サンプルデータの挿入
sqlINSERT INTO documents (content) VALUES ('我爱自然语言处理技术'), ('中文分词是文本处理的重要步骤'), ('pg_jieba是一个很好的中文分词工具,它基于结巴分词库'), ('ServBay 让本地开发变得简单高效');1
2
3
4
5
全文検索インデックスの作成 
データが多い場合の検索効率向上のために、全文検索対象カラムへのインデックス作成を強く推奨します。PostgreSQLのGIN(Generalized Inverted Index)型が全文検索に適しています。
GINインデックスの作成 先ほど作成した
chinese設定とto_tsvector関数を使い、content列にGINインデックスを作成します。to_tsvector('chinese', content)は、contentをpg_jieba(chinese構成)で分かち書きし、全文検索用のtsvector型に変換します。sqlCREATE INDEX idx_gin_content ON documents USING gin (to_tsvector('chinese', content));1
全文検索クエリの実行 
to_tsquery関数と@@演算子を使い、全文検索クエリを実行できます。to_tsquery('chinese', '検索語')で検索語句をtsquery型に変換し、@@でマッチングします。
検索クエリの実行 「中文」と「分词」の両方を含む文書を検索します。
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', '中文 & 分词');1
2
3
4
5&は論理AND、|は論理OR、!は論理NOTを表します。例:「ServBay」または「开发」を含む文書を検索する場合
sqlSELECT id, content FROM documents WHERE to_tsvector('chinese', content) @@ to_tsquery('chinese', 'ServBay | 开发');1
2
3
4
5
カスタム辞書の利用 
pg_jiebaはJieba分かち書きライブラリのデフォルト辞書を使用していますが、専門用語や固有名詞などを追加し分かち書き精度を高めたい場合、カスタム辞書を作成・利用できます。
独自の辞書ファイルを作成し、pg_jiebaで利用するよう設定できます。
カスタム単語の追加方法 
カスタム辞書ファイルの作成 ServBayの設定ディレクトリ下などにテキストファイルを作成します。
plaintext/Applications/ServBay/etc/pg_jieba/custom_dict.txt1本パスは推奨例です。ServBayのインストール場所・構成に合わせて適宜調整してください。
カスタム辞書へ単語を追加 テキストエディタで
custom_dict.txtを開き、1行につき1単語を記載します。必要に応じて、単語の後ろに出現頻度(frequency)や品詞(tag)をスペース区切りで指定できます。形式は単語 [頻度 [品詞]]です。頻度値が大きいほど分かち書き時に優先されます。plaintext自然语言处理 3 n ServBay 5 eng 结巴分词库 3 n1
2
3例:
3 nは「自然语言处理」が頻度3・名詞(n)、「ServBay」は頻度5・英語(eng)であることを意味します。pg_jiebaにカスタム辞書を認識させる PostgreSQLセッションでpg_jieba.dict_pathパラメータをカスタム辞書ファイルが存在するディレクトリへ設定します。 注意:pg_jieba.dict_pathには原則、辞書ディレクトリを指定します。カスタム辞書が主辞書と同じ、またはpg_jiebaが参照するディレクトリにある場合は、パスの変更が不要なケースもあります。詳細はServBayのpg_jiebaマニュアル、もしくは動作検証で判断してください。ServBay環境で直接カスタム辞書ファイルを指定可能な場合、もしくは辞書ディレクトリに配置した場合の例:
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/'; -- 主辞書とcustom_dict.txtがこのディレクトリにある前提1または、(この例は非標準的ですが原文に準じます)
sqlSET pg_jieba.dict_path = '/Applications/ServBay/etc/pg_jieba/custom_dict.txt'; -- 必要に応じてServBayの仕様でご利用ください1重要:
SETコマンドは実行中セッション内のみ有効です。永続化したい場合はPostgreSQLのpostgresql.confの対応項目にパスを記載してください。
辞書の再読み込み 
カスタム辞書内容やpg_jieba.dict_pathの変更後は、pg_jiebaに辞書再読み込みを指示する必要があります。
辞書の再読込 次のSQL関数を実行します。
sqlSELECT jieba_reload_dict();1正常実行後、以降の分かち書き処理で新しい辞書内容が利用されます。
FAQ(よくある質問) 
Q:
CREATE EXTENSION pg_jieba;実行時に「extension "pg_jieba" is not available」と表示される場合どうしたらよいですか? A:これはPostgreSQLの拡張ディレクトリにpg_jieba拡張が正しくインストールされていない、または見つからない場合に起こります。ServBay利用中の場合、pg_jiebaは事前インストール済みです。ServBay提供のPostgreSQLインスタンスに接続しているか、インストールに破損がないかご確認ください。問題が解決しない場合、ServBayの再起動やログ確認を推奨します。Q:カスタム辞書が効果を発揮しない場合どうすればいいですか? A:以下の点をご確認ください。
- 辞書ファイルパスが正しいか、PostgreSQLユーザーに読込権限があるか
 - 辞書ファイルの書式が正しいか(1行1単語、オプションで頻度・品詞をスペース区切り)
 pg_jieba.dict_pathを正しく設定したか(SETはセッション限定。永続化はpostgresql.conf)SELECT jieba_reload_dict();で辞書を再読み込みしたかpostgresql.conf編集時はPostgreSQLを再起動したか
Q:全文検索の結果が期待通りでない場合は? A:分かち書き精度やクエリ構築が重要です。
- 分かち書き精度確認のため、
ts_debug('chinese', '検索したい文章')関数でchinese構成の分かち書き結果を調べましょう。品詞やカスタム辞書効果も確認できます。 ALTER TEXT SEARCH CONFIGURATION chinese ADD MAPPING FOR ... WITH simple;で対象品詞を調整し、不必要な助詞や記号などを除外します。- クエリを見直し、
to_tsqueryへの渡し方や論理演算子(&,|,!)の使い方を確認しましょう。 
- 分かち書き精度確認のため、
 
まとめ 
pg_jiebaはPostgreSQLで本格的な中国語全文検索を実現する強力なツールです。ServBayのプリインストール拡張機能を活用することで、ローカル環境でも容易に中国語分かち書きを導入できます。この記事の手順により、ServBayでのpg_jiebaインストール・テキスト検索構成・全文検索・カスタム辞書活用方法を一通り習得できたはずです。これら技術を自プロジェクトに応用することで、中国語コンテンツ検索性の大幅な向上が期待できます。
