オリジナルのページはこちら
2009年7月6日*1、某大学の某氏*2にRubyはやってないのかと尋ねられ、 そのときは、
ブックマークはしているけどインストールしていない、最近はPerlばかり使ってて
と答えたのです*3。
が、インストールしてしまったのでした。
素のMySQLではなく、全文検索のできるsennaが組み込まれたMySQLであるTritonnと、データベースの操作をするならこれからはこれ!のRuby on Railsをインストールし、Ruby on Rails + Tritonnによるらくらく全文検索+KWIC表示のチュートリアルに従って動作確認をしようとしたところ、まったく動かなかったのです(7月20日のこと)。
原因はRuby on Railsのバージョンが2であったこと。チュートリアルはRuby on Railsのバージョン1に対してのものでした(Last modified: 2009-03-23とありましたが。Ruby on Rails2は2007年12月にリリース)。
そういった訳で、ほぼチュートリアルと同じ動作をする私家版を作らざるを得ず、作ったからには公開する次第です。7月中に公開できれば、6月はPerlやってたけど7月になったのでRubyにしたのさ、と言えたんですが*4、残念。
http://qwik.jp/tritonn/rortutorial.html (Last modified: 2009-03-23)の著作権表示がいまひとつよくわからないのですが、元々の著作権はそのままです。追加訂正した部分はワタクシ。元々の著作権がGNU Free Documentation License (GFDL) ならば、このページもGFDL(このページだけでほかのページは違います)。TritonnがGPLなのでチュートリアルはGFDLかも知れません。Last modified: 2009-03-23 版には明示されてないようですが。
ウィンドウズ版を使いました。OSは Windows VISTA Business。
rubyの本家本元は、http://www.ruby-lang.org/
なお、MySQL(Tritonn)はサーバプロセスとして起動しておかなければなりません
★Tritonnのインストール tritonn-1.0.12-mysql-5.0.67-win32.zipを解凍し、C:\mysqlに配置。
[mysqld] character-set-server=utf8 skip-character-set-client-handshake
cd C:\mysql\bin mysqld-nt.exe --install MySQL
net start MySQL
★rubyをインストール
実際は ActiveScriptRuby 1.8.7(p174) with-winsock2 をインストール
★ruby gem をインストール
ruby setup.rb
★ruby on rails をインストール
引き続き、管理者権限で実行したコマンドプロンプトで
gem install rails
時間が掛かる、10分以上[速いマシンなら速い10Mar2010]
★不具合?に対処[13Mar2010追加]
C:\mysql\bin\libmysql.dll を C:\ruby-1.8l\bin にコピー
これをしないとデータベース作成時(rake db:create)にエラーが出る
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/42378 による
ruby、rails、tritonn は無事にインストールできていることとして、以下進んでください。項目などはオリジナルに準じるよう試みてはいますが、Railsの大幅な変更に対応したので、かなり異なってしまったところもあります。
Railsを開発するフォルダを決めます。
例:C:\Work
以下では、「○○」と示すことがあります。
コマンドプロンプトで(管理者権限のコマンドプロンプトでなくてよい)
プロジェクト「rordemo」を作成し、データベースにMySQLを設定する(デフォルトではsqlite3)
cd ○○ rails rordemo -d mysql
rordemoプロジェクトが作成される。フォルダやファイルが一気にできる。
cd rordemo ruby script/generate scaffold article content:text
rordemoプロジェクトの雛形が作成される。フォルダやファイルが一気にできる。
○○/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
《変更後》 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は文字数が制限される。MySQL 5 のリファレンスマニュアルによると
rake db:create rake db:migrate
データベースの設定が完了 & 一番簡単な入力フォームの完成
ruby script/server
(停止は Ctrl+c)
http://localhost:3000/Articles/
にアクセス
Listing articles Content New article
が見えればおっけい
この「おまけ」の項目は単に記録であって、動かすためには何もしなくてよいものです。とはいえ、ちょっとは気になる点だと思いここに書いときます
MySQLのユーザ: root パスワード: なし
これは、○○/rordemo/configdatabase.yml に自動で下のように作成されたものが設定されたため。
必要に応じて書き換えること、と書くとチュートリアルふうかしら
development: adapter: mysql encoding: utf8 reconnect: false database: rordemo_development pool: 5 username: root password: host: localhost
mysql> show tables; で二つテーブルが見える
データベース: rordemo_development テーブル: articles, schema_migrations
トラブルがあったらテーブルを二つとも drop してからやり直す。articles だけしか drop しないと上手くいかないことがある。
mysql> desc articles; の結果
Field | Type | Null | Key | Default | Extra |
id | int(11) | NO | PRI | NULL | auto_increment |
content | longtext | YES | MUL | NULL | |
created_at | datetime | YES | NULL | ||
updated_at | datetime | YES | NULL |
mysql> show index from rordemo_development.articles; の結果
Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation |
articles | 0 | PRIMARY | 1 | id | A |
articles | 1 | content | 1 | content | NULL |
Cardinality | Sub_part | Packed | Null | Index_type | Comment |
2 | NULL | NULL | BTREE | ||
NULL | NULL | NULL | YES | FULLTEXT |
generate を利用して、検索を行うページを作成
ruby script/generate controller Search
○○/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
○○/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
○○/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>
[ミスを修正14Mar2010]
雛形で作られたレイアウトを共通に使えるよう名前を変える
○○/rordemo/app/views/layouts/articles.html.erb を
application.html.erb
に
○○/rordemo/public/stylesheets/scaffold.css (の末尾)にキーワードに対応したスタイルを追記
#word { background-color: #faf }
これで検索結果画面のキーワード部分に背景色がつく
ページ間の移動のためのリンクを追加。しなくても「全文検索+KWIC表示」できる
<%= link_to 'Back', :action => '' %>これで検索結果画面から、検索画面へ戻れるようになります。
<a href="../articles/">閲覧/登録</a>これで検索画面から、記事登録/閲覧画面へ飛べるようになります。
<br /><a href="../search">検索</a>これで記事登録/閲覧画面から検索画面に飛べるようになります。
Today:1 | Yesterday:1 | Total:6692 since 2 August 2009 |