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 関
+数のような働きです。
+
+== 少し複雑な検索
つづく。。。