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_database
1例:デフォルトのユーザーとデータベースを使用する場合
bashpsql -U servbay -d servbay
1pg_jieba
拡張の作成と有効化psql
コマンドラインで、次のSQL文を実行します。sqlCREATE EXTENSION pg_jieba;
1既に拡張が作成済みの場合はエラーが表示されますが、問題ありません。
pg_jieba
拡張が有効化されているか確認 インストール済み拡張一覧を表示します。sql\dx
1一覧に
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.txt
1本パスは推奨例です。ServBayのインストール場所・構成に合わせて適宜調整してください。
カスタム辞書へ単語を追加 テキストエディタで
custom_dict.txt
を開き、1行につき1単語を記載します。必要に応じて、単語の後ろに出現頻度(frequency)や品詞(tag)をスペース区切りで指定できます。形式は単語 [頻度 [品詞]]
です。頻度値が大きいほど分かち書き時に優先されます。plaintext自然语言处理 3 n ServBay 5 eng 结巴分词库 3 n
1
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
インストール・テキスト検索構成・全文検索・カスタム辞書活用方法を一通り習得できたはずです。これら技術を自プロジェクトに応用することで、中国語コンテンツ検索性の大幅な向上が期待できます。