2011年8月25日木曜日

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
indextankはherokuで10000docまで無料の全文検索として使えるらしいので試してみた。
gemのtankerならそれを簡単に扱えるらしい。

本家
https://indextank.com/home

参考
https://github.com/kidpollo/tanker
https://github.com/adrnai/rails-3-tanker-demo
↑これを参考にしながら試してみました

準備
・テスト用データ
rails g scaffold post name:string title:string content:string
rake db:migrate

準備終わり。ここからtanker

・apiのurlを取得
indextank本家から
https://indextank.com/home
メールアドレスのみで取得できるようだ

・indexの作成
ダッシュボードのログインして
テスト用のindexをcreateする
とりあえずtestindextankという名前でcreatしてみた。


・gemfileに記述。インストール
gem 'tanker'
gem "will_paginate", "~> 3.0.pre2"
pagenateも使っているみたいなのでついでに書いておく

bundle install

・indextankaのapiのurlを記述する
config/initializers/tanker.rbを作成し以下を記述
YourAppName::Application.config.index_tank_url = 'http://:xxxxxxxxx@xxxxx.api.indextank.com'

YourAppNameにはrailsのアプリ名を、index_takn_urlには取得したPrivate API urlを登録してみた

次にモデルを修正
・postモデル
class Post < ActiveRecord::Base
  include Tanker
  tankit 'testindextank' do
    indexes :name
    indexes :title
    indexes :content
    indexes :timestamp do
      Time.new.to_i
    end
  end
  after_save :update_tank_indexes
  after_destroy :delete_tank_indexes

end

tankit 'indexの名前'のところに先ほど作成したindexを入れてある
name、title、content、timespampをindexとして作成して
saveのときにそれを実行して、destroyのときにindexを削除する。なるほど


次にコントローラーを修正
・posts_controllerにsearchメソッドを追加
 def search
    @posts = Post.search_tank(params[:query])

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @posts }
    end
  end


次にビューを修正
・postにsearch.index.erbを作成し以下のように記述

<h1>Listing posts</h1>

<%= form_tag(search_path, :method => "get") do %>
  <%= label_tag(:query, "Search for:") %>
  <%= text_field_tag(:query) %>
  <%= submit_tag("Search") %>
<% end %>

<table>
  <tr>
    <th>Name</th>
    <th>Title</th>
    <th>Content</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>

<% @posts.each do |post| %>
  <tr>
    <td><%= post.name %></td>
    <td><%= post.title %></td>
    <td><%= post.content %></td>
    <td><%= link_to 'Show', post %></td>
    <td><%= link_to 'Edit', edit_post_path(post) %></td>
    <td><%= link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>
</table>

<br />

<%= link_to 'New Post', new_post_path %>

indexにsearchフォームを追加した感じになっている。


最後にルートの修正
・config / routes.rbに以下のように修正
resources :posts
match '/search' => 'posts#search'

ここまででコードはできた。
早速、適当にpostデータを登録。データは適当に。












登録できたら、indexされているか確認してみる









ちゃんとindex登録されてる。いい感じ。
/searchから検索してみる。

・メロン











1つ検索された。OK

・りんご













2つ検索された。OK

・晴れ













contentの晴れの2つを検索。OK

・晴れ 雨(and検索)












contentの晴れときどき雨を検索。OK

うまくいけたんじゃないかな。
ただ、モデルを隔てて検索しようと思ったけど
すっきりする方法がわからない。
Tanker.search([Post,Comment],parms[:query])
という形で複数のモデルに対してデータは取得できるみたいだが
そこからいろいろ加工しないとダメなんだろうか。

あとググってしらべると日本語は完全にサポートがされてない?

まあとりあえずこの辺で。使うときに深く調べてみよう。

0 件のコメント:

コメントを投稿