= チュートリアル このページでは簡単なアプリケーションの作成を通して Ruby/groongaの操作方法を紹介します。 == インストール Ruby/groongaはRubyGemsでインストールできます。 % sudo gem install groonga == データベースの作成 簡単なブックマークアプリケーション用のデータベースを作ってみ ます。以下のようにgroongaライブラリを読み込んでirbを起動しま す。 % irb --simple-prompt -rubygems -rgroonga >> まず、エンコーディングを設定します。ここではUTF-8を利用します。 >> $KCODE = "UTF-8" => "UTF-8" >> Groonga::Context.default_options = {:encoding => :utf8} => {:encoding=>:utf8} それでは、ファイルを指定してデータベースを作成します。 >> Groonga::Database.create(:path => "/tmp/bookmark.db") => # ここで作成したデータベースは、これ以降、暗黙のうちに利用され ます。最初にデータベースを作成したら特に意識する必要はありま せん。 == テーブルの定義 groongaには以下の3種類のテーブルがあります。 [Groonga::Hash] ハッシュテーブル。主キーでレコードを管理します。キーと完全 一致するレコードを非常に高速に検索することができます。 [Groonga::PatriciaTrie] パトリシアトライ。ハッシュテーブルに比べて完全一致検索の速 度がやや遅いですが、前方一致検索・共通接頭辞探索などの検索 が行えます。またカーソルを用いてキーの昇降順にレコードを取 り出すことができます。 [Groonga::Array] 配列。主キーの存在しないテーブルです。レコードはIDによって 識別します。 ここではハッシュテーブルを利用して、という名前のテー ブルを作成します。 >> items = Groonga::Hash.create(:name => "", :persistent => true) => # これでという名前のテーブルが作成できました。 テーブルはRubyのHashのように扱えます。 例えば、以下のように+size+でテーブルに登録されているレコード の件数を取得できます。 >> items.size 0 == レコードを追加する テーブルにレコードを追加します。 >> items.add("http://ja.wikipedia.org/wiki/Ruby") => # >> items.add("http://www.ruby-lang.org/") => # 件数を確認すると確かに2件増えています。 >> items.size => 2 主キーを指定してレコードを取り出す時には以下のようにします。 >> items.find("http://ja.wikipedia.org/wiki/Ruby") => # == 全文検索を行う 各itemのタイトル文字列を登録して、全文検索できるようにしてみ ましょう。 まずテーブルに+title+という名前のカラムを追加します。 >> title_column = items.define_column("title", "", :persistent => true) => # 2番目の引数は、追加するカラムのデータ型を示しています。 等の型が基本型として用意されて います。 全文検索するためには、文字列を分解して得られる各単語を格納す るためのテーブルを別途しなければなりません。ここではと いう名前でテーブルを定義します。 >> terms = Groonga::Hash.create(:name => "", :key_type => "", :persistent => true, :default_tokenizer => "") => # ここでは、トークナイザとして:default_tokenzier => "" を指定しています。トークナイザとは文字 列を単語に分解するオブジェクトのことです。デフォルトではトー クナイザは指定されていません。全文検索を利用するためにはトー クナイザを指定する必要があるので、ここではN-gramの一種である バイグラムを指定しています。 N-gramを利用した全文検索では、分解したN文字とその出現位置を利 用して全文検索を行います。N-gramのNは文字列を何文字毎に分解す るかの文字数になります。groongaは1文字で分解するユニグラム、 2文字のバイグラム、3文字のトリグラムをサポートしています。 単語格納用テーブルの準備ができたので、テーブ ルの+title+カラムに対するインデックスを定義します。 >> title_index_column = terms.define_index_column("item_title", items, :persistent => true, :source => ".title") => # 少し違和感を感じるかも知れませんが、テーブル のカラムに対するインデックスは、テーブルのカ ラムとして定義します。 にレコードが登録されると、その中に含まれる単 語に該当するレコードがに自動的に追加されるよ うになります。 は、文書に含まれる語彙に相当する、やや特殊な テーブルだと言えます。しかし、他のテーブルと同様に語彙テーブ ルには自由にカラムを追加し、単語毎の様々な属性を管理すること ができます。これはある種の検索処理を行う際には非常に便利に機 能します。 これでテーブルの定義は完了です。 先ほど登録した各レコードの+title+カラムに値をセットします。 >> items.find("http://ja.wikipedia.org/wiki/Ruby")["title"] = "Ruby" => "Ruby" >> items.find("http://www.ruby-lang.org/")["title"] = "オブジェクトスクリプト言語Ruby" "オブジェクトスクリプト言語Ruby" 以下のようにして検索することができます。 >> title_index_column.search("Ruby").collect {|record| record.key.key} ["http://ja.wikipedia.org/wiki/Ruby", "http://www.ruby-lang.org/"] 検索結果はGroonga::Hashで返されます。ハッシュのキーに見つかっ たのレコードが入っています。上の例では +record.key+でのレコードを取得して、さらにそ のキーを指定して(+record.key.key+)でのキー を返しています。 == マルチユーザ向けのブックマークアプリケーション ここまでで作った単機能のアプリケーションをもう少し拡張して、 複数のユーザが、それぞれにコメントを記入できるブックマークア プリケーションにしてみましょう。 まず、ユーザ情報とコメント情報を格納するテーブルを追加して、 下図のようなテーブル構成にします。 http://qwik.jp/senna/senna2.files/rect4605.png まず、テーブルを追加します。 >> users = Groonga::Hash.create(:name => "", :key_type => "") => # >> users.define_column("name", "") => # 次に、テーブルを追加します。 >> comments = Groonga::Hash.create(:name => "", :key_type => "") => # >> comments.define_column("item", items) => # >> comments.define_column("author", users) => # >> comments.define_column("content", "") => # >> comments.define_column("issued", "