TUTORIAL.ja.rdoc in groonga-0.0.2 vs TUTORIAL.ja.rdoc in groonga-0.0.3

- old
+ new

@@ -26,11 +26,11 @@ => {:encoding=>:utf8} それでは、ファイルを指定してデータベースを作成します。 >> Groonga::Database.create(:path => "/tmp/bookmark.db") - => #<Groonga::Database id: <nil>, name: (anonymous), path: </tmp/bookmark.db>, domain: <nil>, range: <nil>> + => #<Groonga::Database ...> ここで作成したデータベースは、これ以降、暗黙のうちに利用され ます。最初にデータベースを作成したら特に意識する必要はありま せん。 @@ -52,11 +52,11 @@ ここではハッシュテーブルを利用して、<tt><items></tt>という名前のテー ブルを作成します。 >> items = Groonga::Hash.create(:name => "<items>", :persistent => true) - => #<Groonga::Hash id: <18>, name: <<items>>, path: </tmp/bookmark.db.0000012>, domain: <nil>, range: <nil>, encoding: <:utf8>, size: <0>> + => #<Groonga::Hash ...> これで<tt><items></tt>という名前のテーブルが作成できました。 テーブルはRubyのHashのように扱えます。 @@ -67,11 +67,11 @@ >> items.size 0 == レコードを追加する -items>テーブルにレコードを追加します。 +<tt><items></tt>テーブルにレコードを追加します。 >> items.add("http://ja.wikipedia.org/wiki/Ruby") => #<Groonga::Record ...> >> items.add("http://www.ruby-lang.org/") => #<Groonga::Record ...> @@ -91,11 +91,11 @@ 各itemのタイトル文字列を登録して、全文検索できるようにしてみ ましょう。 まず<tt><items></tt>テーブルに+title+という名前のカラムを追加します。 - >> title_colum = items.define_column("title", "<text>", :persistent => true) + >> title_column = items.define_column("title", "<text>", :persistent => true) => #<Groonga::VarSizeColumn ...> 2番目の引数は、追加するカラムのデータ型を示しています。 <tt><int></tt>、<tt><text></tt>、<tt><longtext></tt>等の型が基本型として用意されて います。 @@ -123,13 +123,13 @@ 2文字のバイグラム、3文字のトリグラムをサポートしています。 単語格納用テーブルの準備ができたので、<tt><items></tt>テーブ ルの+title+カラムに対するインデックスを定義します。 - >> terms.define_index_column("item_title", items, - :persistent => true, - :source => "<items>.title") + >> title_index_column = terms.define_index_column("item_title", items, + :persistent => true, + :source => "<items>.title") => #<Groonga::IndexColumn ...> 少し違和感を感じるかも知れませんが、<tt><items></tt>テーブル のカラムに対するインデックスは、<tt><terms></tt>テーブルのカ ラムとして定義します。 @@ -153,11 +153,11 @@ >> items.find("http://www.ruby-lang.org/")["title"] = "オブジェクトスクリプト言語Ruby" "オブジェクトスクリプト言語Ruby" 以下のようにして検索することができます。 - >> title_index_column.saerch("Ruby").collect {|record| record.key.key} + >> title_index_column.search("Ruby").collect {|record| record.key.key} ["http://ja.wikipedia.org/wiki/Ruby", "http://www.ruby-lang.org/"] 検索結果はGroonga::Hashで返されます。ハッシュのキーに見つかっ た<tt><items></tt>のレコードが入っています。上の例では +record.key+で<tt><items></tt>のレコードを取得して、さらにそ @@ -247,25 +247,25 @@ 上記の一連の手続きをメソッドにまとめてみます。 >> @items = items >> @comments = comments >> def add_bookmark(url, title, author, content, issued) - >> item = @items.find(url) || @items.add(url, :title => title) - >> @comments.add(:item => item, - >> :author => author, - >> :content => content, - >> :issued => issued) + >> item = @items.find(url) || @items.add(url, :title => title) + >> @comments.add(:item => item, + >> :author => author, + >> :content => content, + >> :issued => issued) >> end +itmes+と+comments+をインスタンス変数に代入しているのはメソッ ド内からでも見えるようにするためです。 +add_bookmark+は以下のような手順を実行しています。 - * <tt><items></tt>テーブルに該当ページのレコードがあるかどうか調べる。 - * レコードがなければ追加する。 - * <tt><comments></tt>テーブルにレコードを登録する。 +* <tt><items></tt>テーブルに該当ページのレコードがあるかどうか調べる。 +* レコードがなければ追加する。 +* <tt><comments></tt>テーブルにレコードを登録する。 作成したメソッドを呼び出していくつかブックマークを登録してみ ましょう。 >> add_bookmark("http://practical-scheme.net/docs/cont-j.html", @@ -278,7 +278,73 @@ "なんでも継続", "taporobo", "トランポリン LISP continuation", 1187568692) => #<Groonga::Record ...> == 全文検索その2 + +登録したレコードに対して全文検索を実行してみます。 + + >> records = comments.select do |record| + >> record["content"] =~ "LISP" + >> end + >> records.each do |record| + >> record = record.key + >> p [record.id, + >> record[".issued"], + >> record[".item.title"], + >> record[".author.name"], + >> record[".content"]] + >> end + [1, Sat Aug 18 18:40:26 +0900 2007, "[翻訳]JavaScript: 世界で最も誤解されたプログラミング言語", "モリタン", "JavaScript LISP"] + [2, Mon Aug 20 09:11:32 +0900 2007, "なんでも継続", "モリタン", "継続 LISP Scheme"] + [3, Mon Aug 20 09:13:13 +0900 2007, "末尾再帰", "タポロボ", "末尾再帰 Scheme LISP"] + [4, Mon Aug 20 09:11:32 +0900 2007, "なんでも継続", "タポロボ", "トランポリン LISP continuation"] + +カラムへのアクセスは、カラム名を+.+で繋いで複合データ型の要素 +を再帰的に辿ることができます。(同様の出力を普通のRDBで実現す +るためには、<tt><items></tt>テーブル、<tt><comments></tt>テー +ブル、<tt><users></tt>テーブルのJOIN操作が必要になります。) + +上の式の中で、肝心の検索処理は、第一引数の式を評価する時点で +完了していて、レコードセットオブジェクトとしてメモリに蓄積さ +れています。 + + >> records + #<Groonga::Hash ..., size: <4>> + +レコードセットは、出力する前に様々に加工することができます。 + +以下は、日付で降順にソートしてから出力した例です。 + + >> records.sort([{:key => ".issued", :order => "descending"}]).each do |record| + >> record = record.key + >> p [record.id, + >> record[".issued"], + >> record[".item.title"], + >> record[".author.name"], + >> record[".content"]] + >> end + [3, Mon Aug 20 09:13:13 +0900 2007, "末尾再帰", "タポロボ", "末尾再帰 Scheme LISP"] + [2, Mon Aug 20 09:11:32 +0900 2007, "なんでも継続", "モリタン", "継続 LISP Scheme"] + [4, Mon Aug 20 09:11:32 +0900 2007, "なんでも継続", "タポロボ", "トランポリン LISP continuation"] + [1, Sat Aug 18 18:40:26 +0900 2007, "[翻訳]JavaScript: 世界で最も誤解されたプログラミング言語", "モリタン", "JavaScript LISP"] + +同じitemが何度も出てくると検索結果が見にくいので、item毎にグ +ループ化してみます。 + + >> records.group([".item"]).each do |record| + >> item = record.key + >> p [record[".:nsubrecs"], + >> item.key, + >> item[".title"]] + >> end + [1, "http://d.hatena.ne.jp/brazil/20050829/1125321936", "[翻訳]JavaScript: 世界で最も誤解されたプログラミング言語"] + [2, "http://practical-scheme.net/docs/cont-j.html", "なんでも継続"] + [1, "http://d.hatena.ne.jp/higepon/20070815/1187192864", "末尾再帰"] + ++.:nsubrecs+というのはグループ化した単位に含まれるレコードの +件数を示します。SQLで言えば、GROUP BY句を含むクエリのcount 関 +数のような働きです。 + +== 少し複雑な検索 つづく。。。