イントラ実験室2の1 データベース(を元に動的に作成されるページ)をNamazuで検索できるようにするいいかげんな方法

まえおき(2009-04-30)

イントラネット内のファイルに対して全文検索をかけられるようにNamazuを導入した訳だが,ひとつ問題がある。 Namazuは本来,「静的なファイルに対してあらかじめIndexを作成しておいて,検索語句にヒットするファイルを教えてくれる」っていうシステムなので,データベース(ここではMySQLを想定している)に登録されたデータを,目的に応じてスクリプト(ここではPHPを想定している)で呼び出して表示させるページは検索対象にできないことだ。

これでは困るので,素人なりに考えて,かなりいいかげんな(?)方法を用いて回避してみることにした訳だ。

構想(2009-04-30)

このいいかげんな方法の屋台骨となるのは,『たとえスクリプトを実行し動的に作成されるページだとしても,ユーザーが閲覧するときにはhtml化されている』ってことだ。 そのhtml化されたスクリプト処理結果をファイルとして残しておけば,後はNamazuでIndex化が可能だ。 この,ユーザーが閲覧(もしくはデータ登録)するときの処理の流れを一度整理してみよう。

アクションデータ登録時の流れデータ呼び出し時の流れ
Step1登録画面を呼び出し
(例:DataInput.html)
まずは一覧画面を画面表示
(例:DataList.php
Step2各種記入事項をFormに入力して「登録」実行詳細を見たいデータを選択
Step3スクリプト処理にジャンプしてデータベースへ登録(例:DataInput.php)し,その結果を画面表示
(例:DataView.php?id=9999
スクリプトにジャンプして,目的のデータを画面表示
(例:DataView.php?id=9999

上記のようなプロセスなら,登録されたデータを一覧画面表示している「DataList.php」と,それぞれの詳細データ表示画面「DataView.php?id=9999」をファイル化しておけばいいことになる。

ファイル化の方法

さて問題は,どうやってファイル化するか,だ。 わざわざこの為だけにファイルに吐き出して保存しておくのはいかにも無駄だ。 だけど,PHP使いとしてはそんな機能を持ったツールを普段から使っているような気がする。 そう,Smartyだ。

Smartyは本来,PHPの処理の中から画面に表示させる部分だけを外部でおこなわせるテンプレートエンジンで,データ処理部分と画面表示部分を別々に考えられるので便利に使用しているが,その機能としてキャッシュがあるじゃないか。 この機能を使えば,何の意識もせずに表示結果をファイルとして残しておくことが可能だ。

Smartyのキャッシュ機能を有効にする(2009-04-30)

膨大なアクセスがある訳でもない小さなイントラネットなので,負荷低減のためのキャッシュ機能なんて有効にしてなかったので,まずはそれから設定だ。 ただし,Smartyそのものについては他の詳しいサイトを見てもらいたい。 また,キャッシュ機能についてもまじめに調べたいなら同様だ。

//例:DataView.phpの場合
$smarty -> caching = 1;                                  #キャッシュを有効にする
$smarty -> cache_dir = 'C:/Inetpub/Smarty/cache_dir';    #キャッシュを入れるフォルダ
$smarty -> display("DataView.tpl" , $id);                #テンプレートを指定して画面表示

ここでのポイントは,「display」時に「$id」を指定しておくことだ。 この「$id」はデータのID番号だが,そうしておくことによって,それぞれのデータIDに応じたキャッシュファイルが作成されることになる。 では,この設定でデータを登録した後のキャッシュフォルダの中身はどうなっているかというと...

%%8B^8BD^8BD2AE58%%DataView.tpl
1^%%8B^8BD^8BD2AE58%%DataView.tpl
2^%%8B^8BD^8BD2AE58%%DataView.tpl
3^%%8B^8BD^8BD2AE58%%DataView.tpl

みたいになっている。ファイル名の始めに数字の付いてないのは「DataView.php」でアクセスしたとき,数字付きは「DataView.php?id=数字」でアクセスしたときのキャッシュだ。「.tpl」と,テンプレートの拡張子が付いているが中身はhtmlだ(最初にキャッシュ制御関連の文字列が付いてるようだ)。 これでともかく,ファイル化は完了だ。

NamazuのIndexへの登録と検索(2009-04-30)

いよいよ,Namazuでインデックス化に挑戦だ。 ただし,Namazuそのものについては他の詳しいサイトを見てもらいたい。

mknmzについて

さて,上記の方法で作成したキャッシュのフォルダに対して,Namazuのコマンド「mknmz」を実行してみると...どのキャッシュファイルもNamazuのインデックスに登録されないと思う。 それは「.tpl」の拡張子が付くファイルはインデックス対象になっていないからだ。 じゃぁどうするかというと,方法は以下の二つ。

  1. Smartyテンプレートファイルの拡張子を「.htm」とか「.html」にする。
  2. 「mknmzrc」を編集して「.tpl」を対象にする。

今回は,2の方法を試してみることにした。

#mknmzrcの編集例
$ALLOW_FILE& =	".*¥¥.(&:$HTML_SUFFIX)|.*¥¥.txt" . # HTML, plain text
				"|.*¥¥.tpl";

これで「mknmz」によるインデックス化ができることになる。

.namazurcについて

ここまでの作業で,Namazuのインデックスにデータは登録されたが,このままでは,検索結果でヒットしてリンク先として表示されるのは「Smartyのキャッシュファイル」で,本来の目的である「スクリプトの実行結果として作成されるページ」ではない。 そこで,インデックス化されたキャッシュファイルからスクリプトへの誘導をNamazuの「.namazurc」にある「Replace」機能でおこなうことにする。

#.namazurcの編集例
Replace  /[Cc]¥|/Inetpub/Smarty/cache_dir/%%.*%%(.*).tpl http://ServerName/$1.php
Replace /[Cc]¥|/Inetpub/Smarty/cache_dir/([0-9]*)¥^%%.*%%(.*).tpl //ServerName/$2.php?id=$1

この設定で,上で作ったデータ(とか,同様に作成する「DataList.php」のキャッシュ)に対して検索をかけると以下の形でリンク先が変換されるだろう。

インデックス化された元ファイル変換されたリンク先
%%8B^8BD^8BD2AE58%%DataView.tplDataView.php
1^%%8B^8BD^8BD2AE58%%DataView.tplDataView.php?id=1
%%F4^F48^F48618ED%%DataList.tplDataList.php

まとめ(2009-04-30)

これで,データベース内の情報(を利用して動的に作成されるページ)をNamazuで検索できるようになった。 ただ,この方法では『誰かが画面表示をさせないと登録されない。』という制限事項がある(それはデータ登録時を想定)。 もっとクールな方法があれば(きっとあるに違いないが)教えてもらえるとありがたい。

そうそう,根本的な問題が残っていた。 それは,こうやって考え出したこの機能がウチのイントラ内で有効活用されるかどうか...だ。