Rails - Tire と 全文検索エンジン Elasticsearch (3)
Rails - Tire と 全文検索エンジン Elasticsearch (2) - そういうことだったんですね の続きです。
Tire用のアプリケーションを作成
rails のアプリケーション searchapp を作成します。今回はDBはsqlite3を使います
$ rails new searchapp
Gemfile に次の行を追加します
searchapp/Gemfile
gem 'tire'
bundle を実行します
$ cd searchapp
$ bundle
以下のモデルをscaffoldで作成します
$ rails generate scaffold Article title:string content:string author:string published_on:time
データベースを作成しmigrateします
$ rake db:create RAILS_ENV
$ rake db:migrate
これで準備完了です
Tireを組み込む
はじめにモデルです。Articleモデルに 以下のモジュールをインクルードします
app/models/article.rb
class Article < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::Callbacks
end
これだけです(笑)
インデックスの作成
レコードを作成すると自動的にインデックスが作成されます
ブラウザから画面作るよりも、rails console を使って確認してみましょう
$ rails console
2.0.0-p247 :001 > Article.create :title=>"ラーメン二郎",:content=>"またもやマシマシいき ました。ニンニクと脂まみれです",:author=>"babiy3104",:published_on=>Time.now
(0.1ms) begin transaction
SQL (52.1ms) INSERT INTO "articles" ("author", "content", "created_at", "published_on", "title", "updated_at") VALUES (?, ?, ?, ?, ?, ?) [["author", "babiy3104"], ["content", "またもやマシマシいきました。ニンニクと脂まみれです"], ["created_at", Mon, 02 Sep 2013 12:19:24 UTC +00:00], ["published_on", 2013-09-02 21:19:24 +0900], ["title", "ラーメン二郎"], ["updated_at", Mon, 02 Sep 2013 12:19:24 UTC +00:00]]
(1.8ms) commit transaction
=> #<Article id: 1, title: "ラーメン二郎", content: "またもやマシマシいきました。ニンニクと脂まみれです", author: "babiy3104", published_on: "2013-09-02 21:19:24", created_at: "2013-09-02 12:19:24", updated_at: "2013-09-02 12:19:24">
インデックスは作成されたでしょうか ? curl で確認してみましょう。
$ curl -XGET "http://localhost:9200/articles/article/1"
{
"_index" : "articles",
"_type" : "article",
"_id" : "1",
"_version" : 1,
"exists" : true, "_source" : {"title":"ラーメン二郎","content":"またもやマシマシいき ました。ニンニクと脂まみれです","author":"babiy3104","published_on":"2013-09-02T21:26:30+09:00","created_at":"2013-09-02T12:26:30.822Z","updated_at":"2013-09-02T12:26:30.822Z"}
}
うまく作成されています。初期値では、インデックス名は articles
、タイプ名は article
です。
実際に検索する
こちらも簡単です
$ Article.search "ラーメン"
=> #tire::results::collection:0x00000004b3b8f8 response="{"took"=">3, "timed_out"=>false, "_shards"=>{"total"=>5, "successful"=>5, "failed"=>0}, "hits"=>{"total"=>1, "max_score"=>0.047945753, "hits"=>[{"_index"=>"articles", "_type"=>"article", "_id"=>"1", "_score"=>0.047945753, "_source"=>{"title"=>"ラーメン二郎", "content"=>"またもやマシマシいき ました。ニンニクと脂まみれです", "author"=>"babiy3104", "publis&lt;hed_on"=>"2013-09-02T21:26:30+09:00", "created_at"=>"2013-09-02T12:26:30.822Z", "updated_at"=>"2013-09-02T12:26:30.822Z"}}]}}, @options={:size=>10}, @time=3, @total=1, @facets=nil, @max_score=0.047945753, @wrapper=Tire::Results::Item></tire::results::collection:0x00000004b3b8f8>