Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

既存のrailsプロジェクトにgroongaを追加する

既存のrailsプロジェクトにgroongaを追加する方法です。
今回はprofessorsというモデルのnameカラムに対して全文検索をかけるシステムを想定しています。

gem 'rroonga'

と追記し

$ bundle install

して導入します。
コンパイルが入るので若干時間が掛かります。
終わったら

$ rails g migration use_mroonga_in_professors_table

出来たmigrationファイルに次のように描きます

class UseMroongaInProfessorsTable < ActiveRecord::Migration
  def change
    execute <<-SQL
    ALTER TABLE professors
      ENGINE = mroonga COMMENT = 'engine &quot;innodb&quot;' DEFAULT CHARSET utf8
    SQL

    execute <<-SQL
    ALTER TABLE professors
      ADD FULLTEXT INDEX index_professors_on_name (name)
    SQL
  end
end

あとは

#seed.rb
    ## 253 for mroonga test
    Professor.create(name:        'alpha alpha',
                     ....
                     )


## 254 for mroonga test
    Professor.create(name:        'beta alpha',
                     ...
                     )

といった初期データを用意して

$ bundle exec rake db:create ##MySQLが新規ならば
$ bundle exec rake db:migrate
$ bundle exec rake db:reset

としてmroongaを有効にしつつ初期データを放り込みます。
では、

$ rails c

を実行して確認します

>> pp Professor.where("match(name) against('alpha')")
  Professor Load (1.1ms)  SELECT `professors`.* FROM `professors` WHERE (match(name) against('alpha'))
[#<Professor id: 253, name: "alpha alpha", ... >,
 #<Professor id: 254, name: "beta alpha", ...>]

>> pp Professor.where("match(name) against('beta')")
  Professor Load (0.9ms)  SELECT `professors`.* FROM `professors` WHERE (match(name) against('beta'))
[#<Professor id: 254, name: "beta alpha", ...>]

ちゃんと検索されてますね

(5/8追記)
...と思ったのですが上手く行ってませんでした。
「Can't initialize function 'mroonga_command'」と出たらエンジンがちゃんとmroongaになっていない - Bye Bye Moore

参考もと