Tsearch2のセットアップ -SUSE Linux 9.1 編-

PostgreSQLの追加モジュールに全文検索機能を追加する”Tsearch2″というものがあります。このモジュールは日本語には対応していないのですが、kakasiなどを使用して、分かち書きをしてあげることで日本語の全文検索が可能になるようです。これについては下記のサイトにパッチやドキュメントなどが用意されています。(もう消えてしまったようです)
PostgreSQL + Tsearch2日本語化パッチによる日本語全文検索システム

http://www.oss.ecl.ntt.co.jp/tsearch2j/

ここでは、SUSE Linux 9.1でTsearch2を使用するために必要な設定のやり方を紹介します。Tsearch2の使用方法や設定についての詳細は下記のサイトをご覧ください。ここでの設定方法も下記のサイトをもとに、各ファイルのパスをSUSE Linux 9.1に合わせて書いています。
Tsearch2 – Introduction

http://www.sai.msu.su/~megera/postgres/gist/tsearch/V2/docs/tsearch-V2-intro.html

インストール

字句解析に必要となる辞書データを作成するために、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が使用できるようになります。

著書紹介

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Akira Hayashi (林 晃)のアバター Akira Hayashi (林 晃) Representative(代表), Software Engineer(ソフトウェアエンジニア)

アールケー開発代表。Appleプラットフォーム向けの開発を専門としているソフトウェアエンジニア。ソフトウェアの受託開発、技術書執筆、技術指導・セミナー講師。note, Medium, LinkedIn
-
Representative of RK Kaihatsu. Software Engineer Specializing in Development for the Apple Platform. Specializing in contract software development, technical writing, and serving as a tech workshop lecturer. note, Medium, LinkedIn

目次