Railsコードリーディング

第6回 全文検索を実装したソースコードを読もう

倉貫 義人
松村 章弘
TIS株式会社
SonicGarden

2009/9/3

icon キャッシュ生成フェイズのコードを読んでみよう

 まずは、キャッシュ生成フェイズのコードリーディングを始めましょう。

 キャッシュファイルとメタ情報の生成は、Webからの操作でなく、定期的に実行されるRubyプログラムなので、libディレクトリ配下に配置されています。

 Rubyプログラムを実行されると呼び出される部分のソースコードです。このプログラムの構造として、このメソッドを起点にして記事や共有ファイルごとのキャッシュを生成するメソッドを呼び出します。

●lib/batch_make_cache.rb
23  def self.execute options
24    cache_path = get_cache_path
25
26    maker = self.new()
27    maker.public_methods.each do |method|
28      if method.index("make_caches_") == 0
29        contents_type = method.gsub("make_caches_", "")
30        maker.send(method, contents_type, cache_path, options[:time])
31      end
32    end
33    File.symlink( SkipEmbedded::InitialSettings['share_file_path'],"#{cache_path}/share_file" ) unless FileTest.symlink?("#{cache_path}/share_file")
34  end

 24行目で、キャッシュを出力するパスを取得しています。これは設定ファイルの内容を基に別のメソッドで取得されています。26行目で、このクラスのオブジェクトをインスタンス化しています。

 27行目から32行目のブロックでは、そのオブジェクトに存在するパブリックなメソッドすべての中で「make_caches_」で始まるメソッドを探し、30行目のsendメソッドで見つかったメソッドを呼びだしています。こうすることで、キャッシュを生成するオブジェクトが増加したとしても、メソッドを規約どおりに増やすだけでほかの部分への影響を考えずに追加できます。

 33行目では、共有ファイルの実体ファイルはファイルとして全文検索の対象としたいので、シンボリックリンクをキャッシュの領域に作成することでキャッシュの生成の変わりとしています。

 次に、先ほどのsendメソッドから呼びだされるキャッシュファイルを実際に作成するメソッドを見ていきましょう。

●lib/batch_make_cache.rb
44  # entry用
45  def make_caches_entry(contents_type, cache_path, border_time)
46    entries = load_not_cached_entries(border_time)
47    entries.each do |entry|
48      contents = create_contents(:title => entry.title,
49                                 :body_lines => entry_body_lines(entry) )
50
51      publication_symbols = entry.entry_publications.map{|publication| publication.symbol}.join(',')
52      meta = create_meta(:contents_type => contents_type,
53                         :title => entry.title,
54                         :publication_symbols => publication_symbols,
55                         :link_url => "/page/#{entry.id}",
56                         :icon_type => 'report' )
57
58      output_file(cache_path, contents_type, entry.id , contents, meta)
59    end
60  end

 46行目では、対象となる記事一覧を取得しています。このバッチファイルは、指定なしで実行すると過去15分に更新された情報のキャッシュファイルを生成するようになっているため、対象となるのはデフォルトでは15分以内に更新のあった記事一覧になります。

 47行目からは、それぞれの記事について、キャッシュを生成していく処理に入っていきます。48、49行目は、キャッシュのHTMLの本文(検索対象となる部分)を取得しています。

 entry_body_linesメソッドにより、記事本文の内容だけでなくコメントの内容も含めて検索対象となる文字列を生成していきます。記事だけに対して検索すると記事の内容のみを検索することになるのですが、キャッシュを生成して全文検索を行うことにより、記事にひも付いた情報も検索対象に含むことができます。

 51行目では、記事の閲覧権限を取得しています。52行目から56行目では、メタ情報を取得・設定しています。58行目では、output_fileメソッドに、これまで収集した情報を引き渡しファイルへの出力を行ないます。

 この処理は画面ではなく、Rubyプログラムで実行される部分ですので、デモサイトでは操作できません。試す場合は、実際にソースコードをDLして実行してみてください。

icon 収集フェイズのコードを読んでみよう

 実は、このフェーズでSKIPのコードはありません。すべてHyperEstraierのみで完結します。しかし、利用する上で1点ポイントがあるので、少し紹介しておきます。

 キャッシュファイルをクロールする際に、HyperEstraierに付属しているWebのクローラを利用しています。このクローラがデータを収集するためには、収集対象であれるキャッシュをHTTPで配信する必要があります。

 しかし、ここで配信している情報が誰でも閲覧できるようになっていると、誰でもすべての情報にアクセスできるため情報が漏えいしてしまいます。

 そこで、われわれは配信に軽量WebサーバであるLihgttpdを利用し、HyperEstraierのクローラのIPからしかアクセスを許可しないようにしました。そのための設定方法のサンプルが、config/lighttpd.confとして同梱されているので、全文検索を利用される場合は参考にしてください。

prev
3/4
next

Index
全文検索を実装したソースコードを読もう
  Page1
全文検索機能で情報の収集を便利に実現
SKIPの全文検索のアーキテクチャ
全文検索エンジン「HyperEstraier」
  Page2
全文検索キャッシュの仕組み
全文検索の動作の流れ
SKIPのソースコード入手方法
Page3
キャッシュ生成フェイズのコードを読んでみよう
収集フェイズのコードを読んでみよう
  Page4
検索フェイズのコードを読んでみよう

index Railsコードリーディング 〜scaffoldのその先へ〜

 Ruby/Rails関連記事
プログラミングは人生だ
まつもと ゆきひろのコーディング天国
 ときにプログラミングはスポーツであり、ときにプログラミングは創造である。楽しいプログラミングは人生をより実りあるものにしてくれる
生産性を向上させるRuby向け統合開発環境カタログ
Ruby on Rails 2.0も強力サポート
 生産性が高いと評判のプログラミング言語「Ruby」。統合開発環境を整えることで、さらに効率的なプログラミングが可能になる
かんたんAjax開発をするためのRailsの基礎知識
Ruby on RailsのRJSでかんたんAjax開発(前編)
 実はAjaxアプリケーション開発はあなたが思うよりも簡単です。まずはRuby on Railsの基礎知識から学びましょう
Praggerとnetpbmで作る画像→AA変換ツール
Rubyを使って何か面白いものを作ってみよう!
 一般的な画像をアスキーアートに変換するツールを作ってみる。さらに出力にバリエーションを持たせてみよう
コードリーディングを始めよう
Railsコードリーディング〜scaffoldのその先へ〜(1)
 優れたプログラマはコードを書くのと同じくらい、読みこなす。優れたコードを読むことで自身のスキルも上達するのだ
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間