[groonga-dev,00495] Re: Re: rroongaでのタグ検索

Zurück zum Archiv-Index

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/
> 




groonga-dev メーリングリストの案内
Zurück zum Archiv-Index