読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

既存の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

参考もと