PostgreSQLの追加モジュールに全文検索機能を追加する”Tsearch2″というものがあります。このモジュールは日本語には対応していないのですが、kakasiなどを使用して、分かち書きをしてあげることで日本語の全文検索が可能になるようです。これについては下記のサイトにパッチやドキュメントなどが用意されています。(もう消えてしまったようです)
PostgreSQL + Tsearch2日本語化パッチによる日本語全文検索システム
ここでは、SUSE Linux 9.1でTsearch2を使用するために必要な設定のやり方を紹介します。Tsearch2の使用方法や設定についての詳細は下記のサイトをご覧ください。ここでの設定方法も下記のサイトをもとに、各ファイルのパスをSUSE Linux 9.1に合わせて書いています。
Tsearch2 – Introduction
インストール
字句解析に必要となる辞書データを作成するために、ISpellとISpellのソースコードをYaSTを使用してインストールします。
辞書データのビルド
前項でダウンロードしたISpellのソースコードを展開し、一緒にダウンロードされたパッチデータを適用します。
> cd /usr/src/packages/SOURCES/
> tar -xjf ispell-3.2.07.tar.bz2
> ...パッチを適用する...
ISpellのソースツリー内のlanguages/englishに移動し、辞書データをビルドします。
> cd ispell-3.2.07/languages/english
> sort -u -t/ +0f -1 +0 -T /usr/tmp -o english.med english.0 english.1
“english.med”というファイルが作成されるので、ISpellの辞書データが保存されているディレクトリにコピーします。
> cp english.med /usr/lib/ispell
Tsearch2の登録
使用したいデータベースにTsearch2を登録します。この操作で、Tsearch2が利用するテーブルがいくつか作成され、デフォルトデータが登録されます。
> psql -e -f /usr/share/postgresql/contrib/tsearch2.sql db_name
ロケールの設定
pg_ts_cfgテーブルにシステムロケールの情報を追加します。SUSE Linux 9.1ではデフォルト設定ではUTF-8になっていますので、次のようなSQLを実行します。
INSERT INTO pg_ts_cfg (ts_name, prs_name, locale) VALUES ('default_english', 'default', 'ja_JP.UTF-8');
‘default_english’は設定の名前、prs_nameは使用するパーサー名でここではデフォルト、最後はロケールです。
辞書の登録
「辞書データのビルド」でビルドした辞書をTsearch2に登録します。ここでは、”en_ispell”という名前で登録します。次のSQLを実行します。
INSERT INTO pg_ts_dict (SELECT 'en_ispell', dict_init, 'DictFile="/usr/lib/ispell/english.med", AffFile="/usr/lib/ispell/english.aff",'
'StopFile="/usr/share/postgresql/contrib/english.stop", dict_lexize FROM pg_ts_dict WHERE dict_name='ispell_template');
これで、辞書が登録されました。次に、常にこの辞書を使用するように設定します。
SELECT set_curdict('en_ispell');
字句解析の設定
どのタイプの字句に、どの辞書を使用するかという設定を行います。参考にしたサイトと同じように、lhword、lpart_hword、lwordのタイプの字句に対しては、前項で登録した”en_ispell”を使用し、それ以外の字句に対しては”simple”(デフォルトで登録されています。)を使用するように設定します。
en_ispellを使用するように設定するSQL
INSERT INTO pg_ts_cfgmap (ts_name, tok_alias, dict_name) VALUES ('default_english', 'lhword', '{en_ispell, en_stem}');
INSERT INTO pg_ts_cfgmap (ts_name, tok_alias, dict_name) VALUES ('default_english', 'lpart_hword', '{en_ispell, en_stem');}
INSERT INTO pg_ts_cfgmap (ts_name, tok_alias, dict_name) VALUES ('default_english', 'lword', '{en_ispell, en_stem}');
simpleを使用するように設定するSQL
INSERT INTO pg_ts_cfgmap VALUES ('defalut_english', 'url', '{simple}');
INSERT INTO pg_ts_cfgmap VALUES ('defalut_english', 'host', '{simple}');
INSERT INTO pg_ts_cfgmap VALUES ('defalut_english', 'sfloat', '{simple}');
INSERT INTO pg_ts_cfgmap VALUES ('defalut_english', 'uri', '{simple}');
INSERT INTO pg_ts_cfgmap VALUES ('defalut_english', 'int', '{simple}');
INSERT INTO pg_ts_cfgmap VALUES ('defalut_english', 'float', '{simple}');
INSERT INTO pg_ts_cfgmap VALUES ('defalut_english', 'email', '{simple}');
INSERT INTO pg_ts_cfgmap VALUES ('defalut_english', 'word', '{simple}');
INSERT INTO pg_ts_cfgmap VALUES ('defalut_english', 'hword', '{simple}');
INSERT INTO pg_ts_cfgmap VALUES ('defalut_english', 'nlword', '{simple}');
INSERT INTO pg_ts_cfgmap VALUES ('defalut_english', 'nlpart_hword', '{simple}');
INSERT INTO pg_ts_cfgmap VALUES ('defalut_english', 'part_hword', '{simple}');
INSERT INTO pg_ts_cfgmap VALUES ('defalut_english', 'nlhword', '{simple}');
INSERT INTO pg_ts_cfgmap VALUES ('defalut_english', 'file', '{simple}');
INSERT INTO pg_ts_cfgmap VALUES ('defalut_english', 'uint', '{simple}');
INSERT INTO pg_ts_cfgmap VALUES ('defalut_english', 'version', '{simple}');
以上の操作でTsearch2が使用できるようになります。