そういうことだったんですね

いろいろ調べたり学んだりしたことを忘れないように書き連ねています

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>