Rails全文検索導入記(MySQL+Senna(Tritonn)+CentOS5):Rails編

本題のRailsへの適用方法へ。

構成

MVCはこんな構成で。

controller
 -user_controller.rb
model
 -user.rb
views
 -search.html.erb
 -index.html.erb

テーブルはこんな感じ

カラム名 説明
id ID
name 名前
address 住所

また、全文検索ではacts_as_tritonnを使用してみることにした。

適用手順

acts_as_tritonnプラグインインストール
$ script/plugin install http://ryu.rubyforge.org/svn/acts_as_tritonn
Usersテーブル & FULLTEXT INDEX生成

Migration作成。INDEXはMecabで。

#●create_users.rb
class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table "users", :force => true do |t|
      t.column :name,    :string
      t.column :address, :string
    end
    add_index :users,  [:name], :fulltext => "MECAB"
    add_index :users,  [:address], :fulltext => "MECAB"
  end

  def self.down
  end
end
Model
#●user.rb
class User < ActiveRecord::Base
  acts_as_tritonn
end
View
#●index.html.erb
THE 全文検索
<% form_tag({:action => "search"}, {:method => "get"}) do %>
  <%= text_field_tag "q", @q, :class => "query" %>
  <%= submit_tag "検索" %>
<% end %>
#●search.html.erb
<% form_tag({:action => "search"}, {:method => "get"}) do %>
  <%= text_field_tag "q", @q, :class => "query" %>
  <%= submit_tag "検索" %>
<% end %>
<table border="1">
  <tr>
    <th>id</th>
    <th>名前</th>
    <th>住所</th>
  </tr>
  <% @users.each{|m| %>
  <tr>
    <td><%= m.id %></td>
    <td><%= m.name %></td>
    <td><%= m.address %></td>
  </tr>
  <% } %>
</table>
Controller
#●user_controller.rb
class UserController < ApplicationController
  def index
  end

  def search
    @q = params[:q]
    # nameとaddress両方をor検索。(複数カラムを対象とする場合は:allオプションを有効にする。)
    query = {:name => @q, :address => @q}
    @users= User.find_fulltext(query, :all => true)
  end
end

簡単簡単!