先月の29日に、全文検索エンジンgroongaを囲む夕べ #1が開催されました。内容はgroonga本体について、groongaとRubyについて、groongaとMySQLについて、groongaとPostgreSQLについて、とgroonga三昧の内容でした。
groongaとRubyについての資料は以降で紹介します。groongaとPostgreSQLについてはすでに資料が公開されています(textsearch groonga v0.1)。参加できなかった方は参考にしてください。
それでは、groongaとRubyについての資料を簡単な解説付きで紹介します。
Ustreamで配信したものの録画もあります。Ruby枠は49分くらいからです。
リリース情報
開催日当日の29日、groongaの新しいバージョン1.0.4がリリースされました。もちろん、この夕べに合わせたものです。
さらに、groongaをRubyから使うためのライブラリrroongaも新しいバージョンがリリースされました。もちろん、これもこの夕べに合わせたものです。
興味がある方はぜひ最新版を利用してください。
話すこと
Rubyからgroongaを使う、ということが実に手になじむということを重点的に話します。これはgroongaをRubyらしく使えるライブラリが提供されているためです。そして、そのライブラリを提供しているのがラングバプロジェクトです。
ラングバプロジェクト
groongaをRubyらしく使えるライブラリや周辺ライブラリ・ツールなど、groongaとRubyに関連するソフトウェアなどを提供しているのがラングバプロジェクトです。WebサイトはRubyForgeにホスティングしてもらっていて、ソースコードはGitHubにホスティングしてもらっています。以降で紹介するライブラリ・ツールはすべてGitHub上にあります。
ラングバプロジェクトの目標は「使いやすい検索システムを手早く、簡単に」実現できるようにすることです。
そのために、ラングバプロジェクトは全文検索システムを提供します。しかし、1つの全文検索システムですべてのケースをカバーすることはできません。そのため、全文検索システムを作るために必要な部品も再利用できる形で提供します。部品を組み合わせることで環境に合わせた全文検索システムを構築することができます。
このようにして「使いやすい検索システムを手早く、簡単に」という目標の実現を目指します。
提供物一覧
まずは、ラングバプロジェクトがどのような名前のライブラリ・ツールを提供しているかを紹介します。それぞれのライブラリ・ツールが全文検索システムのどの部分の機能を提供するかは図で示します。
まず、全文検索システムにはどのような機能があるかを確認しておきましょう。
全文検索システムは、まず、「検索対象」から文書を収集します。これが「クローラー」と呼ばれる機能です。次に、収集してきた文書からテキスト情報やタイトル・更新時刻などといったメタ情報を抽出し、全文検索エンジンに登録します。この文書を登録する機能を「インデクサー」と呼びます。最後に、全文検索エンジンに登録されている文書を簡単・便利にユーザが検索できるインターフェイスが必要です。これが「検索インターフェイス」です。最近はWebアプリケーションとして「検索インターフェイス」を提供することが多いです。
それでは、ラングバプロジェクトが提供する機能の紹介です。
全文検索エンジンgroonga(ぐるんが)をRubyから利用するためのライブラリであるrroonga(るるんが)を提供します。
インデクサーで必要になる、文書からテキストとメタ情報を抽出するライブラリ・ツールがChupaText(ちゅぱてきすと)です。
ChupaTextをRubyのライブラリとして使えるようにするのがChupaRuby(ちゅぱるびー)です。
rroongaをRuby on Rails 3から簡単に使えるようにするのがActiveGroonga(あくてぃぶぐるんが)です。
Rails 3も含むRackアプリケーションで使えるユーティリティを集めたのがracknga(らくんが)です。
これらのライブラリ・ツールを利用した全文検索システムが文書検索ラングバです。プロジェクトが提供するライブラリ・ツールを集結したものなので、プロジェクトと同じ名前が付いています。
それでは、それぞれのツールについて紹介します。
rroonga
rronngaはRubyからgroongaの全文検索エンジンの機能を使えるようにするためのライブラリです。groongaの機能をRubyらしい書き方で書けることを重視したAPIになっていることが特徴です。
例えば、groongaのスキーマを言語内DSLとして書けるようになっています。groonga自体もスキーマを定義するための言語を持っていますが、rroongaではこのように通常のRubyの式としてスキーマを書けるようにしています。Rubyでスキーマを書けるため、新しくgroongaのスキーマ定義用の文法を覚える必要がありません。
検索条件も通常のRubyの式で書けます。Rubyでは「=~」は「マッチさせる」場合に使われる演算子ですが、rroongaでも「マッチ(キーワードを全文検索してキーワードが含まれる文書を返す)」という意味で使っています。自然な書き方ですね。
もう少し複雑な条件も自然に書くことができます。例では「タイトルか説明から本文に"Ruby"と"検索"という単語を含んでいる1ヶ月以内のサイト」を検索しています1。この条件でもRubyで使われている演算子を同じ意味で使っているので、自然に書くことができます。
検索条件をRubyで指定すると検索が遅くなるのではと思うかもしれません。しかし、その心配は不要です。ブロックの中身は1度だけ評価され、groongaの条件式オブジェクトにコンパイルされます。groongaはそのC言語で記述された条件式オブジェクトを使って検索を行うので、rroongaを使わない場合と同様に高速に検索します。
ORマッパーでは検索条件はSQL文字列を組み立てることに相当しますが、rroongaでは直接groongaの条件式を作ります。検索エンジンがSQL文字列をパースする必要がないため、より少ないコストで検索のための下準備をすることができます。
rroongaは様々な場面で有用です。例えば、データを加工しながらgroongaに登録するインデクサーを作る場合です。サイト検索システムなら各ページで共通のヘッダー部分とフッター部分は検索対象から外したいでしょう。そのとき、Rubyでそのあたりの処理を実装してそのままgroongaに登録できると便利です。
他にも、groongaに入っているデータを利用しながら新しいデータを登録する場合もrroongaを使うと便利です。
rroongaはるりまサーチでも利用されているので、実際にどのように使われているかを調べたいときは、るりまサーチのソースコードを見てください。
rroongaは以下のコマンドでインストールできます。
% sudo gem install rroonga
groongaがインストールされていない場合は自動的にダウンロード・ビルドして利用します。便利ですね。
ChupaText
ChupaTextはテキスト抽出ツールです。「複数の入力形式を1つの操作方法」で扱えることを目標に開発が進められています。
ChupaTextはchupatextコマンドとC言語用のAPIを提供しています。chupatextコマンドは抽出したテキストをMultipurpose_Internet_Mail_Extensions形式で出力します。MIME形式を採用したのは以下の理由からです。
- 広く普及している形式である。
- メタデータとテキストを扱える。
- メタデータはヘッダーとして表現。ヘッダーの項目は拡張可能なこともちょうどよい。
- テキストは本文として表現。
- 複数のファイルを扱える。アーカイブからテキストを抽出した 場合にこれがうれしくなる。
入力形式はこれからも増えていくでしょう。それに対応するため、ChupaTextは拡張しやすい設計になっています。ChupaText本体を変更しなくても新しい入力形式に対応するためのモジュールを後付けで追加することができます。
現在はC言語で共有ライブラリを作成するか、Rubyスクリプトを作成して、所定の位置に置くことで入力形式を追加することができます。Rubyスクリプトでも拡張できるのは、ChupaText内にRubyインタプリタが組み込まれているからです。
ChupaTextはaptitudeでインストールできます。
% sudo aptitude install chupatext
詳細はChupaTextのインストールドキュメントを見てください。
ChupaRuby
ChupaRubyはChupaTextをRubyのライブラリとして使用できるようにします。ChupaTextをHTTP経由で利用するためのインターフェイスを追加する予定です。これが追加されると、「テキスト抽出Webサービス」を構築することができるようになります。
ChupaRubyは以下でインストールすることができます。
% sudo gem install chuparuby
ChupaTextは自動的にインストールされないので、事前にインストールしておいてください。
ActiveGroonga
ActiveGroongaはRails 3用のモデルライブラリです。groongaをモデルのデータストアとして利用することができます。ActiveRecordが提供しているような以下の機能を提供します。
- ActiveGroonga::Base(ActiveRecord::Base相当)
- rake groonga:*(rake db:*相当)
- ジェネレーション
- マイグレーション
- バリデーション
- リレーション
ActiveGroongaは以下でインストールすることができます。
% sudo gem install activegroonga
ActiveGroongaに関するより詳しいことは別の機会に紹介します。
racknga
rackngaは上記のパッケージに入れるには適切ではないな、というものが詰まっているユーティリティパッケージです。RackのミドルウェアやPassenger用Muninプラグインなどがここに入っています。
rackngaは以下でインストールすることができます。
% sudo gem install racknga
文書検索ラングバ
文書検索ラングバはこれまで紹介したライブラリ・ツールを利用した全文検索システムです。groongaの特徴を活かしたWebベースの検索インターフェイスを提供します。例えば、るりまサーチでも提供しているドリルダウン機能などです。
文書検索ラングバはそろそろリリースされる予定です。もうしばらくお待ちください。
まとめ
groongaのRuby関連の情報を紹介しました。便利なライブラリやツールが充実していっているので、ぜひ、Rubyとgroongaを使って全文検索システムを作ってみてください。
-
この資料を使ったのは2010年11月29日です。 ↩