隔週連載groonga

第5回 Rubyでサーバ要らずの高速全文検索! - rroongaの紹介

この記事を読むのに必要な時間:およそ 6 分

Rubyで使いやすいこと

rroongaが大事にしていることの2つめはRubyで使いやすいことです。特に次の2つを大事にしています。

  • インストールしやすいこと
  • RubyらしいAPIであること
インストールしやすいこと

ライブラリを使う場合はまずインストールします。ここでつまずいてしまうと,いくらRubyらしいAPIだろうが関係ありません。使えないんですから。rroongaはRubyスクリプトだけのライブラリではなく,Cで書かれた部分もあるライブラリです。そのため,Rubyスクリプトだけのライブラリに比べるとインストールが難しくなっています。

そこで,できるだけインストールでつまずかない工夫をしています。

Cで書かれた部分があるとインストールの難易度がものすごく高くなるのがWindowsです。そのため,Windows用にはビルド済みのgroongaとrroongaを含んだgemを用意しています。WindowsユーザはRubyさえ用意していればgem install rroongaでインストールできます。事前にgroongaをインストールしておく必要もありません。

ところで,Windows用のRubyパッケージにはいくつか種類がありますが,みなさんは何を使っていますか? 多くの人はRuby Installer for Windowsを使っていることでしょう。他にも64ビットWindows用のRails環境を提供する能楽堂などがあります。能楽堂にはrroongaが同梱されているので,gem install rroongaしなくてもすぐに使えます。

Windows以外の環境でもインストールでつまづかない工夫をしています。LinuxやOS X,*BSD環境ではコンパイル環境があることを前提にしています。コンパイル環境さえあれば事前にgroongaをインストールしなくてもrroongaをインストールできるようにしています。どうしているのかというと,rroongaをビルドするときにgroongaがインストールされていなければ,自動でgroongaのソースをダウンロードしてビルドし,その後にrroongaのインストールを再開します。

どちらの工夫も,ポイントは「通常のインストール方法でインストールできる」ことです。通常のインストール方法とは「gem install gem名」です。⁠事前にgroongaをインストールしてください」というのは通常のインストール方法から外れています。groongaを意識させてはいけません。

rroongaを使いたいRubyプログラマは「全文検索をしたい」ということが目的であり,そのためのライブラリをどうやって用意するかはあまり考えたくないことです。通常のインストール方法であれば特に考えずに済みます。本来であれば「groongaのインストール」という事前のひと手間が必要なrroongaのインストールですが,そのひと手間をなくしてインストールしやすくしています。

このように,rroongaはインストールしやすくすることを大事にしています。

RubyらしいAPIであること

もう1つの大事にしていることはRubyらしいAPIであることです。

RubyらしいAPIとはRubyの既存のオブジェクトと同じような使い方になっているAPIということです。例えば,1つずつ繰り返し実行するイテレータにforeachという名前をつけていればそれはRubyらしくありません。ArrayやHashなど既存のクラスはeachという名前を使っています。同じように動くメソッドなら同じような名前を使っているのがRubyらしいAPIです。

rroongaはライブラリとして全文検索機能を提供しています。つまり,Rubyのコードの中でrroongaのオブジェクトのメソッドが使われるということです。既存のRubyのコードの中に入って全文検索処理をしても,他のRubyのコードと違和感がない状態を目指しています。

簡単な例として,レコードを表すGroonga::Recordの場合を紹介します。

レコードには複数のカラムがあり,検索結果を表示するときはカラムの値を取得します。そのままのAPIにすると次のようになります。

user_name = user.get_column_value("name")

get_XXXというメソッド名はRubyではあまり見ないメソッド名です。そのため,他のRubyコードの中に入ると違和感があります。

レコードを複数のキーとバリューのペアを持つコンテナと考えるとどうでしょうか。RubyにはそのようなクラスとしてHashがあります。HashのAPIを参考にすると次のようになります。

user_name = user["name"]

get_column_valueよりもだいぶRubyらしくなりましたね!

では,これで十分でしょうか? レコードを複数の属性と値を持つオブジェクトと考えるとどうでしょうか。そう考えると次のようなAPIになります。

user_name = user.name

これもRubyらしいですね!

なお,rroongaはuser["name"]user.nameもどちらも使えるようになっています。これは,カラム名には-も含めることができるからです。Rubyのメソッド名で-を使うときは次のように特別な使い方をしなければいけません。

user_created_at = user.send("created-at")

これではRubyらしくありません。メソッド名に使えない文字をカラム名に使っているときは,user["name"]という使い方ができるように両方の使い方を用意しています。通常はuser.nameスタイルを使って,それができないとき,あるいはnameの部分が可変のときはuser["name"]スタイルを使うことを推奨しています。

まとめ

rroongaの歴史と大事にしていることを紹介しました。rroongaのサイトにチュートリアルがありますので,試してみたくなった人はぜひそちらを読んでみてください。

次回は事例紹介です。Tritonnからmroongaへ移行したという事例です。2回分のボリュームでじっくり紹介します! 楽しみですね。

groongaの利用事例を寄稿しませんか

連載の目的は「読者の皆さんがgroongaを使いたくなる!」ことです。そこで,すでにgroongaを使っており,groongaの利用事例を本連載で紹介していただける人を募集します。募集要項を参考にご連絡ください。お待ちしています!

著者プロフィール

須藤功平(すとうこうへい)

フリーソフトウェアプログラマで株式会社クリアコード代表取締役(2代目)。Sennaの後半から開発に参加しはじめて,groongaの開発にも関わるようになる。C言語で書かれたライブラリをRubyから使えるようにすることが趣味なので,Rubyからgroongaを使えるようにするrroongaを開発した。