PostgreSQL上にMediaWiki環境を構築 (3)
これまでで失敗した操作はありますか? もしあればトラブルシュートを参考にしてください。また、PostgreSQL が実際に動作している様子を見てみましょう。
トラブルシュート
エラーログを確認する
うまくいかない操作があった場合、PostgreSQLやApacheのエラーログを確認することで、原因が解明できるかもしれません。それぞれのエラーログは、以下の場所に保存されています。
- PostgreSQL : C:\Program Files\PostgreSQL\8.3\data\pg_log\postgresql-年-月-日_時分秒.log
- Apache : C:\Program Files\PostgreSQL\EnterpriseDB-ApachePhp\apache\logs\error.log
PostgreSQLのログを見てもエラーは無かったのですが、少し気になるログが出力されていました。設定を変更して、大量にログが出ないよう調整しておきましょう。
- LOG: loaded library "$libdir/plugins/plugin_debugger.dll"
- 特に問題は無いのですが、PL/pgSQL のデバッガが読み込まれた際に出力されます。Windows 環境に限っては接続するたびに読み込まれるので何度も表示されてしまいます。すぐに PL/pgSQL デバッガを使う予定が無いようならば、設定ファイルで shared_preload_libraries を空にしておきましょう。
shared_preload_libraries = '$libdir/plugins/plugin_debugger.dll' ↓ shared_preload_libraries = '' # 空文字列
- WARNING: nonstandard use of \\ in a string literal at character N
- 文字列のエスケープを行う場合には文字列を E'' と書く必要があるのですが、 MediaWiki ではこのルールがきちんと守られていないようです。このWARNINGでログが埋め尽くされるのも問題なので、設定ファイルで escape_string_warning を無効にしておきましょう。
escape_string_warning = on ↓ escape_string_warning = off
textsearch_ja.sqlの実行でのエラー
textsearch_ja.sqlを実行する際の典型的なエラーとトラブルシュートを整理します。
DLL が存在しているのに、モジュールが見つからない旨のエラーが表示される場合は、実行に必要なランライム・ライブラリが不足している可能性があります。Microsoft Visual C++ 2010 Redistributable Package (x86) 等を追加でインストールしてみてください。
ERROR: could not load library "C:/Program Files/PostgreSQL/ x.y/lib/textsearch_ja.dll": The specified module could not be found.
以下のようなエラーが表示される場合、拡張モジュールの DLL のアクセス権限が postgres ユーザに与えられていないことが原因かもしれません。textsearch_ja.dll のプロパティを開き、図7 のように postgres ユーザに権限を与えてください。
ERROR: could not load library "C:/Program Files/PostgreSQL/ 8.3/lib/textsearch_ja.dll": Access is denied.
図7 : textsearch_ja.dll のプロパティ設定
Windows の postgres ユーザを管理する
インストーラに任せて postgres ユーザを作成した場合、「コントロール パネル > ユーザー アカウント > アカウントの管理」で表示される一覧に postgres ユーザのアイコンが表示されないと思います。これは異常な動作ではなく、この一覧には Administrators や Users グループに所属するユーザのみが表示されるためです。インストーラが作成する postgres ユーザは、そのままでは何のグループにも所属していません。管理などを行うため一覧に表示させたい場合には、コマンド プロンプトから net localgroup コマンドを使用します。
Vista の場合 : コマンド プロンプトを実行する際、「スタートメニュー > アクセサリ > コマンド プロンプト」のアイコンを右クリックし「管理者として実行」してください。
net localgroup Users postgres /add
これでコントロール パネルに postgres ユーザが表示されるようになったと思います。また、コマンド プロンプトから管理を行うならば、コントロール パネルの一覧に表示させる代わりに、net user コマンドを使用することもできます。例えば、postgres ユーザを削除するには以下のように入力します。PostgreSQL サーバをアンインストールしても Windows の postgres ユーザは削除されないため、残したままにするのが気になる場合にはこのコマンドで削除してください。
net user postgres /delete
PostgreSQL が動作していることを確認する
psql を起動し、テーブルの定義などを見てみましょう。まず psql で mediawiki データベースに接続します。
psql -d mediawiki -U postgres
MediaWiki に関連するテーブルは、スキーマ mediawiki に配置されています。ページの内容が格納されているのは mediawiki.pagecontent テーブルです。\d メタコマンドでテーブル定義を表示させてみます。
mediawiki=# \d mediawiki.pagecontent Table "mediawiki.pagecontent" Column | Type | Modifiers ------------+----------+--------------------------------- old_id | integer | not null default nextval( 中略 ) old_text | text | old_flags | text | textvector | tsvector | Indexes: "pagecontent_pkey" PRIMARY KEY, btree (old_id) "ts2_page_text" gin (textvector) Triggers: ts2_page_text BEFORE INSERT OR UPDATE ON mediawiki.pagecontent FOR EACH ROW EXECUTE PROCEDURE mediawiki.ts2_page_text()
textvector列にインデックス ts2_page_text が定義されていますが、これが全文検索用のインデックスです。インデックスのタイプは gin (Generalized Inverted iNdex; 汎用転置インデックス) で、今回のような全文検索や、配列内の検索のために使われます。
それでは「メインページ」の最新の状態を取得してみましょう。
mediawiki=# \x Expanded display is on. mediawiki=# SELECT old_text, textvector FROM mediawiki.page, mediawiki.pagecontent WHERE page_title = 'メインページ' AND page_latest = old_id; -[ RECORD 1 ]----------------------------------------- old_text | MediaWikiが正常にインストールされました。 : : 使い方・設定に関しては (以下略) textvector | 'faq':26 'さ':4 'し':14 'れ':5 '参照':13 '情報':32 '正常':2 '設定':7,20 'mediawiki':1,25,30 (以下略)
「old_text」列にはページ内容のテキストが格納されています。また、そのテキストから抽出した単語が「textvector」列に保持されています。検索の際には、「textvector」列のいずれかの単語が検索キーワードに一致するページが返されることになります。
まとめ
PostgreSQL のインストーラやパッケージは充実してきており、かなり手軽に導入できるようになってきました。今回の手順だけでも、個人または小規模のグループであれば十分に使える Wiki サイトを構築できるかと思います。こういったパッケージを通じて、今後はますます PostgreSQL に対応するアプリケーションは増えていくのではないかと思います。
また、textsearch-ja は PostgreSQL 組み込みの全文検索を拡張する形で日本語に対応しているため、設定の変更だけで多くのアプリケーションが日本語を扱えるようになります。海外製アプリケーションで日本語を検索できるようにすることは以前よりも容易になりました。
(2009年1月19日公開)