TUTORIAL.ja.rdoc in groonga-0.0.5 vs TUTORIAL.ja.rdoc in groonga-0.0.6

- old
+ new

@@ -185,13 +185,13 @@ => #<Groonga::VarSizeColumn ...> 次に、<tt><comments></tt>テーブルを追加します。 - >> comments = Groonga::Hash.create(:name => "<comments>", - :key_type => "<shorttext>") - => #<Groonga::Hash ...> + >> comments = Groonga::Array.create(:name => "<comments>", + :key_type => "<shorttext>") + => #<Groonga::Array ...> >> comments.define_column("item", items) => #<Groonga::FixSizeColumn ..> >> comments.define_column("author", users) => #<Groonga::FixSizeColumn ..> >> comments.define_column("content", "<text>") @@ -345,6 +345,51 @@ 件数を示します。SQLで言えば、GROUP BY句を含むクエリのcount 関 数のような働きです。 == 少し複雑な検索 -つづく。。。 +↓はまだ動かない!!! + +さらに実用的な検索について考えてみましょう。 + +ブックマークが大量に蓄積されるに従って、より的確に適合度を算 +出する必要性に迫られます。 + +今のところ検索対象として利用できるのは<tt><items>.title</tt> +と<tt><comments>.content</tt>ですが、<tt><items>.title</tt>は +元ページから得られるやや信頼できる情報なのに対して、 +<tt><comments>.content</tt>はブックマークユーザが任意に設定で +きる情報で、やや信憑性に乏しいと言えます。しかし、再現率を確 +保するためにはユーザのコメントも是非対象に含めたいところです。 + +そこで、以下のようなポリシーで検索を行うことにします。 + +* <tt><items>.title</tt>か<tt><comments>.content</tt>のいずれ + かにマッチするitemを検索する。 +* ただし、<tt><items>.title</tt>にマッチしたレコードはスコア + を10倍重み付けする。 +* 同一のitemに対して、キーワードにマッチする<tt>comment</tt> + が複数存在した場合は、それぞれの<tt>comment</tt>のスコアの + 和を、該当するitemのスコアとする。 + +以下のようにして、commentとitemとそれぞれに対する検索結果を求 +めます。 + + >> ruby_comments = @comments.select {|record| record["content"] =~ "Ruby"} + #<Groonga::Hash ..., size: <2>> + >> ruby_items = @items.select("*W1:50 title:%Ruby") + #<Groonga::Hash ..., size: <2>> + +_ruby_comments_の結果をitem毎にグループ化し、_ruby_items_と +unionして出力します。 + + >> ruby_items = ruby_comments.group([".item"]).union!(ruby_items) + #<Groonga::Hash ..., size: <4>> + >> ruby_items.sort([{:key => ".:score", :order => "descendant"}]).each do |record| + >> p [record[".:score"], record[".title"]] + >> end + [1, "るびま"] + [1, "オブジェクトスクリプト言語Ruby"] + [1, "Ruby"] + [1, "ラングバ"] + +これで目的の結果が得られました。(FIXME: 得られていない!)