#contents *私家版:Ruby on Rails + Tritonnによるらくらく全文検索+KWIC表示のチュートリアル [#t23e699d] オリジナルのページは[[こちら>http://qwik.jp/tritonn/rortutorial.html]] 2009年7月6日((日本ショウジョウバエ研究会第9回研究集会の夕食のとき))、某大学の某氏((http://www.cis.kit.ac.jp/~tomaru/jdrc7registration.html に連名でプログラムを公開したりしています……、全然某じゃないか))にRubyはやってないのかと尋ねられ、 そのときは、~ ブックマークはしているけどインストールしていない、最近はPerlばかり使ってて と答えたのです((系統情報の整理にPerlをかなり使っていたのです))。~ が、インストールしてしまったのでした。~ そこで、素のMySQLではなく、全文検索のできるsennaが組み込まれたMySQLである[[Tritonn>http://qwik.jp/tritonn/]]と[[Ruby on Rails>http://rubyonrails.org/]]をインストールし、[[Ruby on Rails + Tritonnによるらくらく全文検索+KWIC表示のチュートリアル>http://qwik.jp/tritonn/rortutorial.html]]に従って動作確認をしようとしたところ、まったく動かなかったのです(7月20日のこと)。~ 原因はRuby on Railsのバージョンが2であったこと。チュートリアルはRuby on Railsのバージョン1に対してのものでした(Last modified: 2009-03-23とありましたが)。~ そういった訳で、ほぼチュートリアルと同じ動作をする私家版を作らざるを得ず、作ったからには公開する次第です。7月中に公開できれば、6月はPerlやってたけど7月になったのでRubyにしたのさ、と言えたんですが((6月の誕生石が真珠、7月がルビー))、残念。 **バージョンなど [#i9926f9e] ウィンドウズ版を使いました。OSは Windows VISTA Business。 - ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mswin32] (ActiveScriptRuby 1.8.7(p174) with-winsock2): http://arton.hp.infoseek.co.jp/indexj.html より入手 - Rails 2.3.2:http://rubyonrails.org/ より入手 - tritonn-1.0.12-mysql-5.0.67-win32.zip: http://sourceforge.jp/projects/tritonn/releases/ より入手。tritonnのページはhttp://qwik.jp/tritonn/。これは、 mysql Ver 14.12 Distrib 5.0.67, for Win32 (ia32) になる。 なお rubyの本家本元は、http://www.ruby-lang.org/ MySQL(Tritonn)はサーバプロセスとして起動して置かなければなりません **0 Tritonnのセットアップ [#we9a3438] ★Tritonnのインストール -mysql-5.0.45-tritonn-1.0.6-win32.zipを解凍し、C:\mysqlに配置する。 --ファイルは「tritonn-1.0.12-mysql-5.0.67-win32.zip」 --環境変数PATHに"C:\mysql\bin"を追加する。(マイコンピュータ→プロパティ→詳細設定→環境変数で設定) --C:\my.iniに以下のように記述する。(これは必須ではないが、推奨) [mysqld] character-set-server=utf8 skip-character-set-client-handshake -mysqldをサービスに登録する。 cd C:\mysql\bin mysqld-nt.exe --install MySQL 管理者権限で実行したコマンドプロンプトで -MySQLを起動する。 net start MySQL 管理者権限で実行したコマンドプロンプトで ★rubyをインストール 実際は ActiveScriptRuby 1.8.7(p174) with-winsock2 をインストール~ -http://arton.hp.infoseek.co.jp/indexj.html から ActiveRuby.msi をダウンロードし、ダブルクリック -c:\ruby-1.8 にインストールする ★ruby gem をインストール -http://rubyforge.org/frs/?group_id=126 から rubygems-1.3.4.zip -zipファイルを展開 -管理者権限で実行したコマンドプロンプトで cd し、 ruby setup.rb ★ruby on rail をインストール 引き続き -管理者権限で実行したコマンドプロンプトで gem install rails 時間が掛かる、10分以上 ruby、rails、tritonn は無事にインストールできていることとして、以下進んでください。項目はオリジナルに準じるよう試みてはいますが、Railsの大幅な変更に対応したので、かなり異なってしまったところもあります。 ** 1 アプリケーションの生成から入力フォーム作成まで [#na60ff24] ***事前準備 [#bb33c82f] Railsを開発するフォルダを決めます。 例:C:\Work 以下では、「○○」と示すことがあります。 ***プロジェクト作成 [#n89018aa] コマンドプロンプトを開きます。事前準備で用意したディレクトリで以下のコマンドを入力します。 プロジェクト「rordemo」を作成し、データベースにMySQLを設定する(デフォルトではsqlite3) rails rordemo -d mysql rordemoプロジェクトが作成される。フォルダやファイルが一気にできる。 ***雛形作成 [#w7407c3a] cd rordemo ruby script/generate scaffold article content:text rordemoプロジェクトの雛形が作成される。フォルダやファイルが一気にできる。 ***テーブル作成 [#cf78c5a4] ○○/rordemo/db/migrate/○○_create_articles.rbを変更 オリジナル class CreateArticles < ActiveRecord::Migration def self.up create_table :articles do |t| t.text :content t.timestamps end end def self.down drop_table :articles end end - MySQLではストーレージエンジンがデフォルトでInnoDBになっているが、TritonnではMYISAMでなければならないそうなので、下のように変更する。http://info.dwango.co.jp/rd/2009/02/ruby-on-rails-mysql.html を参考にしました。 - フルテキストインデックスを作るために、SQL文を発行。ウィンドウズ版なので(また、ちょっとした下心もあるので)N-GRAMで分割するだけとする。 変更後 class CreateArticles < ActiveRecord::Migration def self.up create_table :articles, :options => "ENGINE = MYISAM" do |t| t.text :content t.timestamps end execute "ALTER TABLE articles change content content LONGTEXT" execute "ALTER TABLE articles add FULLTEXT INDEX USING NGRAM (content)" end def self.down drop_table :articles end end ※ 「execute "ALTER TABLE articles change content content LONGTEXT"」は、なくてもいいが、textは文字数が制限される rake db:create rake db:migrate これでデータベースの設定が完了し、一番簡単な入力フォームの完成! #hr なお、 MySQLのユーザ: root パスワードなし MySQLにできる(mysql> show tables; で二つテーブルが見える) データベース: rordemo_development テーブル: articles, schema_migrations トラブルがあったらテーブル二つとも drop してからやり直す articles のフィールドなど(mysql> desc articles; の結果) |Field | Type | Null | Key | Default | Extra |h |id |int(11) |NO |PRI |NULL |auto_increment | |content |longtext |YES |MUL |NULL | | |created_at |datetime |YES | |NULL | | |updated_at |datetime |YES | |NULL | | t.timestamps によって、created_at と updated_at が作られる インデックスなど(show index from rordemo_development.articles; の結果) |size(8) |size(8) |size(8) |size(4) |size(4) |size(4) |size(4) |size(4) |size(4)|size(4)|size(4) |size(4)|c |Table |Non_unique |Key_name |Seq_in_index |Column_name |Collation |Cardinality |Sub_part |Packed |Null |Index_type |Comment |h | articles | 0 | PRIMARY | 1 | id | A | 2 | NULL | NULL | | BTREE | | | articles | 1 | content | 1 | content | NULL | NULL | NULL | NULL | YES | FULLTEXT | | フルテキストインデックスができていることがわかる #hr ***サーバ起動 [#wb29b2d5] ruby script/server (停止は Ctrl+c) ***ページの閲覧 [#d1e7267a] http://localhost:3000/Articles/ にアクセス Listing articles Content New article が見えればおっけい **2 検索機能の追加 [#h0650229] ***ページの作成 [#f67ba107] generate を利用して、検索を行うページを作成します。 ruby script/generate controller Search ***検索フォームの作成 [#w093ed03] ***コントローラにメソッドを追加 [#t6cabea2] ○○/rordemo/app/controllers/search_controller.rb にメソッドを追加 前 class SearchController < ApplicationController end 追加後 class SearchController < ApplicationController def index end def search_text @articles = Article.search_text(params[:query]) flash.now[:notice] = "Search result#{@articles.size}found." render(:action => 'search_text') end end ***モデルにメソッドを追加 [#y5c45b2f] ○○/rordemo/app/models/article.rb を以下のデータに変更 前 class Article < ActiveRecord::Base end 追加後 class Article < ActiveRecord::Base def self.search_text(query) find_by_sql([" select updated_at, match(content) against (?) as score, kwic(content, 150,3,1,'',' ... ', ?, '<span id=word>', '</span>') as snippet from articles where match(content) against(?) order by score desc limit 20", "#{query}","#{query}", "#{query}"]) end end ***ビューの作成と編集 [#ae4ed1c1] ○○/rordemo/app/views/search/search_text.html.erb を新規作成し、以下のように編集。 <table cellpadding="5" cellspacing="0"> <% for article in @articles %> <tr valign="top" class="catalogentry"> <td align="left"> <p>date <%=article.updated_at%><p> <p>score <%=article.score%><p> <p>snippet <%=article.snippet%><p> </td> </tr> <tr><td colspan="2"><div class="separator"> </div></td></tr> <% end %> </table> ○○/rordemo/app/views/search/index.html.erb を新規作成し、以下のように編集。utf-8で保存 <p><label for="article_title"><b>検索</b></label></br> <% form_tag :action => "search_text", method => "post" do %> <%= text_field(:query,nil) -%><%= submit_tag "検索実行" %></p> <% end %> <br> ***共通レイアウトの設定 [#ke76ddd7] 雛形で作られたレイアウトを共通に使えるよう名前を変える ○○/rordemo/app/views/layouts/articles.html.erb を application.html.erb に ***スタイルシートのカスタマイズ [#lb8d2cb4] ○○/rordemo/public/stylesheets/scaffold.css (の末尾)にキーワードに対応したスタイルを追記します。 #word { background-color: #faf } これで検索結果画面のキーワード部分に背景色がつきます。 ***リンクの追加 [#k4e04ab0] 後は好みでリンクを追加すると良いかもしれません。 今のままだとページ間の移動がしにくいパタンがあるのでリンクをいくつか追加します。 ○○/rordemo/app/views/search/search_text.html.erb ページ先頭に以下の一行を追加。 <%= link_to 'Back', :action => '' %> これで検索結果画面から、検索画面へ戻れるようになります。 ○○/rordemo/app/views/search/index.html.erb ページ末尾に以下の一行を追加。utf-8で保存 <a href="../articles/">閲覧/登録</a> これで検索画面から、記事登録/閲覧画面へ飛べるようになります。 ○○/rordemo/app/views/articles/index.html.erb ページ末尾に以下の一行を追加。utf-8で保存 <br /><a href="../search">検索</a> これで記事登録/閲覧画面から検索画面に飛べるようになります。 |Today:&counter(today);|Yesterday:&counter(yesterday);|Total:&counter(); since 2 August 2009|