Ruby: Rails から Elasticsearch で全文検索を実行

elasticsearch を立ち上げておくこと

Elasticsearch と Active Records を連携していい感じに全文検索します。
kuromoji とかも突っ込んどきます。

 

Gemfile に Rails 用の gem を追加

$ vi Gemfile
gem 'elasticsearch-rails'
gem 'elasticsearch-model'
$ bundle install

Rake タスク追加

$ vi lib/tasks/elasticsearch.rake
require 'elasticsearch/rails/tasks/import'

Model クラスで Elasticsearch との関連づけ

たとえば Work クラス

class Work < ActiveRecord::Base
	
	include Elasticsearch::Model

	mapping do
		indexes :name, analyzer: :kuromoji
		indexes :description, analyzer: :kuromoji
	end
	
	def self.search(params)
		__elasticsearch__.search(
			{
				query: {
				  bool: {
					must: [],
					must_not: [],
				    should: [{
					    query_string: {
						    default_field: "work.name",
						    query: params[:q]
					    }
					},
					{
						query_string: {
							default_field: "work.description",
							query: params[:q]
						}
				    }]
				  }
				},
				from: 0,
				size: 10
			}
		)
	end
end

 

Elasticsearch 化

$ rake environment elasticsearch:import:model CLASS='Work' --trace

全部やるなら

$ rake environment elasticsearch:import:all

 

Controller クラスで検索パラメータを突っ込む

def index
    # @works = Work.all
    @works = Work.search(params)
end

ビューの erb は例えばこんなん

<%= form_tag '/search', :method => "get" do %>
    <%= text_field_tag :q, params[:q], :placeholder => '検索' %>
    <%= submit_tag '検索', :name => nil %>
<% end %>

<% @works.each do |work| %>
  <h2><%= work.name %></h2>
  <div><%= work.content %></div>
<% end %>

事前に Work テーブルにアイテムを追加しておいて検索して取れたら成功