Home > Ruby on Rails > HyperEstraierで個人データを検索する[まだ調べ中]

HyperEstraierで個人データを検索する[まだ調べ中]

mixiでも使われているって言う全文検索エンジンHyperEstraier。mixiの膨大な件数を処理するぐらいだから相当スケーラビリティもあるだろなーとおもいつつ、SQLだけで全文検索できちゃうMySQL+Sennaが便利なんで、そっちばっかり使ってました。

MySQL+Senna(Triton)も、PostgreSQL+Senna(Ludia)も、属性付きで検索した場合、Sennaで全文検索してから、その答えをSQLで絞り込みを行っているようで、たとえば、個人のメッセージを保存しているテーブルを検索した場合など、属性の値が多い場合には、かなり効率が悪くなる事が見えてました。

本当は、メッセージみたいなものは、個人ごとにインデックスをもって処理するべきなんだろうなと思っていて、SennaでやるかHyperEstraierでやるか迷いつつ、ぐぐっていたところ、HyperEstraierがどんぴしゃりな機能を持っているのを発見しました。

疑似ノードマスタという機能で、大量のインデックスを保持することが容易にできるようです。

この疑似ノードマスターの話は、おいおい調べるとして、まずはRailsからHyperEstraierを触ってみます。

というほどのものではなく、acts_as_searchableというプラグインを使えば、ほぼ意識することなく、HyperEstraierを扱えるようです。

このプラグインは単純な全文検索だけでなく、属性検索などもサポートしており、通常の用途であれば、これで事が足りそうです。

# estcmd create -tr -attr @user_id num messages
class Message < ActiveRecord::Base
  acts_as_searchable :searchable_fields => [:subject, :body], :attributes => {:user_id => :user_id}
end

と指定する事で、下記の様に特定ユーザのメッセージだけ検索するという事ができます。

Message.fulltext_search("masuidrive",  :attributes => "user_id NUMEQ %d" % User.find_by_name('guest'))

このプラグインで、注意が必要なのは、検索対象として指定したカラムのsetterメソッドが定義されている点です。
この場合は、subject=, body=, user_id=が上書きされます。
プラグインの実行タイミングなどから、define_method_chainは使えないようなので、これらのメソッドを上書きするときは、そのメソッドの中から値を更新するときに、write_attributeの代わりに、write_changed_attributeを呼ぶ様にしてください。

以上、バットノウハウでした。

属性検索の演算子は、ユーザーズガイドの検索条件式を見てください。通常の=演算子などは使えません。

Related posts

masuidrive(増井 雄一郎)
PukiWikiなどのオープンソース活動を経て、2005年からRuby on Railsに的を絞り、WEB2.0社PingKingやニフティ社アバウトミーの開発に関わる。これまでのフリー活動から転身し、2007年は1年だけ会社員として働いた後、起業のため渡米。2008年4月にBig Canvas Inc.設立、iPhoneアプリなどの開発を行う。2009年11月に退社し、現在、米Appcelerator社のテクニカルエバンジェリスト。
Twitterは、@masuidrive

Comments:4

masuidrive 07-12-04 (Tue) 2:05

shidara君と、ActiveModelをベースにして、ActiveHEなんてあったらいいのにねと、言ってみる。

take-sa 07-12-04 (Tue) 6:22

HyperEstraierはデモサイトのWikipedia全文検索を
常用してるぐらいかな?
一度MacOSXに入れようと思ったのだが、敷居が高いのと
すぐにOS側で検索機能が強化されたからやめちゃった。

HyperEstraierの記事も楽しみにするで〜!

グニャラくん 07-12-04 (Tue) 12:54

TritonnもLudiaも属性付き前文検索のチューニングはなかなか大変ですよね…

Sennaの次回バージョンはデータベースがついて、
自前で属性検索と前文検索を組み合わせることができるようになるので、
その際にはまた試してみてください!

masuidrive 07-12-04 (Tue) 14:47

おおお!まじっすか!
それは楽しみにしています。

この手の用途は増えているんですが、なかなか使いやすいものが無くて。

Comment Form
Remember personal info

Trackbacks:1

Trackback URL for this entry
http://blog.masuidrive.jp/index.php/2007/12/04/asts_as_searchable/trackback/
Listed below are links to weblogs that reference
HyperEstraierで個人データを検索する[まだ調べ中] from @masuidrive blog
trackback from 関口宏司のLuceneブログ 08-07-03 (Thu) 4:20

第2回 Rails開発者向け全文検索エンジンSolrの無料セミナー開催…

Ruby on Rails開発者向けに全文検索エンジンSolrの入門セミナー(無料)を開催する。

日時:7月16日(水) 14:00-16:00
場所:株式会社ロンウイット(東京都千代田区丸の内) 会議室
内容:

Home > Ruby on Rails > HyperEstraierで個人データを検索する[まだ調べ中]

Search
Feeds
Meta

Return to page top