Endo Akira
endo4****@goo*****
2011年 4月 11日 (月) 01:55:05 JST
遠藤です。 どうもありがとうございます。 残念ながら検索対象には重複があって、キーにすることはできない のですが、カラムを増やして、検索対象文字列を別カラムで持つ ことにしました。groongaの例で言えば、同姓同名の友人がいるような ものです。友人のreferenceのカラムのほかに、友人の名前をつないだ カラムを作って、そちらを検索することにします。 いろいろなデータ構造に対してどうやれば検索を楽にできるかを柔軟に 考える必要があるようです。RDBでは情報の重複を嫌い、正規化を 説きますが、検索のためにはあえて情報をダブらせることも有用ですね。 実は今作業しているテーブルでは、商品の正式名称、略称、よみの 3つのカラムがあるのですが、検索用にはこの3つを:でつないだものを 用意したのでした。テーブルが大きくなるのをいやがらず、検索用の カラムを積極的に作って、うまく検索していけばいいのですね。 大変勉強になりました。頭が固くなっているようです。 既存の検索アプリが時間がかかりすぎるので、と相談を受け、rrongaで 移植を終えたら、新しい検索項目を加えてくれ、と注文され、テーブルの 構造を変えることなく検索しようとしていたのでした。 Subjectが無題になってしまって失礼しました。 今後もよろしくお願いします。 > groongaのチュートリアルでいうタグ検索と同じパターンかと思い > ました。 > > 3.6. タグ検索・参照関係の逆引き > http://groonga.org/docs/tutorial/tutorial06.html > > > p items.select{|r| r.prods_ref.name =~ 'first'}.size #=> 1 > > p items.select{|r| r.prods_ref.name =~ 'second'}.size #=> 0 > > もし、nameカラムではなくprodsのキーで検索してもよければこれ > で動くと思います。 > > # key_type:を追加。 > Groonga::Schema.create_table("prods", type: :hash, key_type: :string) do |table| > table.short_text("name") > end > # 変更なし > Groonga::Schema.create_table("items", type: :hash) do |table| > table.reference("prods_ref", "prods", type: :vector) > end > # インデックスを追加 > Groonga::Schema.change_table("prods") do |table| > table.index("items.prods_ref") > end > > # nameカラムの値ではなくキーとして登録。 > p1 = prods.add('first') > p2 = prods.add('second') > > # r.prods_ref.nameではなくr.preds_refで検索。 > p items.select{|r| r.prods_ref =~ 'first'}.size #=> 1 > p items.select{|r| r.prods_ref =~ 'second'}.size #=> 1 > > -- > 須藤 功平 <kou****@clear*****> > 株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270) > > プログラミングが好きなソフトウェア開発者を募集中: > http://www.clear-code.com/recruitment/ >