私家版:Ruby on Rails + Tritonnによるらくらく全文検索+KWIC表示のチュートリアル 02 August 2009

オリジナルのページはこちら

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)はサーバプロセスとして起動しておかなければなりません

0 Tritonnのセットアップ

★Tritonnのインストール tritonn-1.0.12-mysql-5.0.67-win32.zipを解凍し、C:\mysqlに配置。

★rubyをインストール 実際は ActiveScriptRuby 1.8.7(p174) with-winsock2 をインストール

★ruby gem をインストール

★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の大幅な変更に対応したので、かなり異なってしまったところもあります。

1 アプリケーションの生成から入力フォーム作成まで

事前準備

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

が見えればおっけい

1.5 おまけ

この「おまけ」の項目は単に記録であって、動かすためには何もしなくてよいものです。とはいえ、ちょっとは気になる点だと思いここに書いときます

MySQLの権限

MySQLのユーザ: root
パスワード:  なし

これは、○○/rordemo/configdatabase.yml に自動で下のように作成されたものが設定されたため。
必要に応じて書き換えること、と書くとチュートリアルふうかしら

development:
  adapter: mysql
  encoding: utf8
  reconnect: false
  database: rordemo_development
  pool: 5
  username: root
  password:
  host: localhost

MySQLにできるデータベースとテーブル

mysql> show tables; で二つテーブルが見える

データベース: rordemo_development
テーブル:   articles, schema_migrations

トラブルがあったらテーブルを二つとも drop してからやり直す。articles だけしか drop しないと上手くいかないことがある。

articles のフィールドなど

mysql> desc articles; の結果

FieldTypeNullKeyDefaultExtra
idint(11)NOPRINULLauto_increment
contentlongtextYESMULNULL
created_atdatetimeYESNULL
updated_atdatetimeYESNULL

インデックスなど

mysql> show index from rordemo_development.articles; の結果

TableNon_uniqueKey_nameSeq_in_indexColumn_nameCollation
articles0PRIMARY1idA
articles1content1contentNULL

  

CardinalitySub_partPackedNullIndex_typeComment
2NULLNULLBTREE
NULLNULLNULLYESFULLTEXT
※ 見やすさ優先のため、左右に長い表を分割しました

2 検索機能の追加

ページの作成

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">&nbsp;</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表示」できる

Today:4Yesterday:0Total:5824 since 2 August 2009

*1 日本ショウジョウバエ研究会第9回研究集会の夕食のとき
*2 http://www.cis.kit.ac.jp/~tomaru/jdrc7registration.html に連名でプログラムを公開したりしています……、全然某じゃないか
*3 系統情報の整理にPerlをかなり使っていたのです
*4 6月の誕生石が真珠、7月がルビー
*5 下心はこういうところにある

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 15 Mar 2010 (月) 01:19:59 (3775d)