PostgreSQLから『Ludia』でSennaの全文検索エンジンを試した

先週、NTT データが GPL ライセンスでリリースした LudiaTMを試用したメモ。
PostgreSQL の Senna ドライバというか、Senna の PostgreSQL バインディングというか、
要は、PostgreSQL から Senna の全文検索エンジンを透過的に利用するために、
インデックスアクセスメソッドと演算子を追加してくれるモジュールです。
⇒ 別のポストに 具体的な使い方 をまとめておきました。

contrib に入っている DBlink とか他のモジュールと同じように .so 形式になっていて、
既存の PostgreSQL のデータベースに追加導入できるので、思った以上にお手軽です。
CREATE FUNCTION/OPERATOR で導入したデータベースにのみ影響があるので、
Ludia をインストールしても、PostgreSQL のソース・バイナリ本体や、
同じサーバ内でも他のデータベースインスタンスには影響を与えません。

PostgreSQL の標準ではインデックスアクセスメソッドとして btree を使いますが、
Ludia を導入すると、fulltext(MeCab版)か fulltextb(N-gram版)の
2つのインデックスアクセスメソッドが利用できるようになります。
以下のようなSQL文で、既存テーブルにインデックスを張ることができます。
CREATE INDEX index1 ON table1 USING btree (col1);
        ↓
CREATE INDEX index1 ON table1 USING fulltextb (col2);

ここで Senna の転置インデックスを作成しているはずなのですが、かなり速いです。
インデックスを張った状態の INSERT 速度も、実用上全く問題ないようです。
インデックスが張れれば、@@ 演算子を使って検索できます。
SELECT * FROM table1 WHERE col1 like '%もも%';
        ↓
SELECT * FROM table1 WHERE col1 @@ 'もも';

通常の用途なら、上記の他に特別な専用関数を覚える必要もありません。
INSERT・UPDATE・DELETE などの操作も通常の SQL 文を発行すれば、
自動的に Senna 側にも反映されるそうです。シンプルで分かりやすい。

少し特殊な全文検索を行いたい場合は、Senna の演算子 も利用できるようです。

手元では、以下の環境で動きました。

    CPU: Intel Core Duo T2300 1.66GHz
    メモリ: 512MB
    OS: Debian (testing) Linux 2.6.11
    MeCab: 不使用(⇒形態素解析せずN-gramにした)
    Senna: 0.8.1
    Ludia: 0.8.0
    PostgreSQL: 8.1.4

PostgreSQL は、apt-get でインストールしたものです。
(昔は LOCALE が要注意だったけど、最近は直ってるのかな?)
Senna・Ludia はソースから入れました。
また、Ludia のコンパイル時に cc1plus コマンドが必要だったので、
『apt-get install g++』でインストールしました。

以下は ludia-0.8.0.tar.gz
内の README ファイルより引用。
概要
----
LudiaはPostgreSQLに高速な全文検索機能を提供します。
全文検索エンジンSennaを利用し、データベース内のテキスト情報を高速検索します。
Ludiaは以下のような特徴をもっています。

PostgreSQLインデックス機能への統合
  PostgreSQLのインデックスアクセスメソッドとして実装されているため、
  B-treeインデックスなど他の種類のインデックスと同じように、
  あるいは他の種類のインデックスと組み合わせて使うことができます。
  検索は追加定義の「@@」演算子を用いて行います。
  また、テーブルにレコードの追加、更新、削除を行った際は、
  インデックス側の情報も自動的に更新されます。

スコアを利用したクエリ文
  全文検索エンジンの検索スコア(検索内容との合致度)をクエリ中で取得し、
  フィルタ条件やソート条件として使用することができます。
(中略)
制限事項
--------
- 複数列インデックスとしては使用できません。
- 一意性インデックスの機能は提供しません。
- VACUUMには完全に対応していません。
  無効なTIDのチェックは行われますが、インデックスのサイズは減少しません。
- REINDEXには対応していません。
  インデックスの再構築は、
  インデックスファイルの削除、インデックスのDROP、インデックスの再作成、
  という手順で行ってください。

DROP INDEX→CREATE INDEX も相当速いので、REINDEX は要らないですね。
ただし、DROP INDEX しても Senna の転置インデックスファイルが
pgdata/main/base/*/*.SEN* あたりに残ってしまうので、
今のところ、DROP INDEX 後に手動でファイル削除が必要とのことです。
⇒ pgs2destroy()関数で一括削除できるそうです。ドキュメントにないけど。
pg_class テーブルで使用中のファイルを確認しながら削除するしかないか。

※「Senna」は「セナ」です。「センナ」ではありません。>自分

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

ludia
2006年10月18日 05:17
pgs2destroy()という関数を呼ぶと、drop後の残骸となったsenna転置インデックスを一括削除してくれるですよ。
2006年10月18日 11:08
ありがとうございます。
自動化できるんじゃ?と思ったら、ちゃんと関数が用意されてたのですね。
今どき珍しく、未だウェブ上に存在しないフレーズの模様。>pgs2destroy
http://www.google.co.jp/search?q=pgs2destroy

この記事へのトラックバック

  • PHPでタグクラウドを生成する方法 – ワードの重み付け (前編)

    Excerpt: SEOの手法としてブログでよく使用されているタグクラウドですが、 今回はPHPで生成する方法を紹介します。   タグクラウドを生成するにはキーワードに重み付けが必要です。 タグの入力欄を設けてユーザー.. Weblog: 携帯サイトをつくろう。 racked: 2009-08-07 19:17