ホーム > HTMLに役立つヒント>
WASearch2導入記
これは鷲崎 弘宜さんの開発した全文検索システム、WASearch2導入記です。作者の鷲崎 弘宜さんに感謝いたします。この文章はバージョン2.22を対象にしています。
[このページの改定日: 05/06/23 17:58] あなたはここへ来た、 10278番目の人です。(2001/8/8から)
WASearchはgrepタイプです。とほほさんのwwwsrchと同じタイプですね。
各ページのスコアによるランク付け、ソーティング、カテゴリー(分野)の指定ができる、といった数々の特徴があります。
僕が特に惹かれたのはランク付けができるという点です。どうやっているんだろう?なお、検索対象のファイルはSJISである必要があります。cgiもSJISで書かれていました。僕のコンパクトカメラデータファイル(これが検索対象ファイルです。例によって)はすべてeucで作られているので、eucファイルを対象とするように改造する必要があります。
●WASearch v2.2.2からwasearch2.lzhをダウンロードしてきます。
最初見たとき、「wasearch2.lzh」がバージョン2.1を表しているように見えてしまった(^_^) 1じゃないよlだよーん(^^;
- wasearch2.lzhを解凍すると4つのファイルができます。必要なのはjcode.plとwasearch2.cgiの2つだけ。ラクチンラクチン。
- wasearch2.cgiの中を開いて、必要な箇所を変更します。@TARGETの指定に手間取りました。難しいからではなく、指定の手間が面倒だったんです。
「../*.html(一つ上のディレクトリ)」だけで済むと思ったら、そうじゃないんです。これだと、本当に一つ上の階層だけしか検索してくれません。僕の場合は例によってコンパクトカメラデータページを検索させたかったんですが、データは各メーカーごとのディレクトリに分かれています。これを指定するためには、「'../canon/*.html','../chinon/*.html'…」というようにディレクトリをちゃんと一つずつ指定しなくてはいけません。
26メーカーあることがこの作業でわかりました。ディレクトリが26あったわけです。ふぅ。
この仕様は、カテゴリわけに関係しています。指定ディレクトリごとにカテゴリを指定できるんですね。これが@categoryの指定です。ここでも26種類のカテゴリを番号で指定します。@TARGETに対応させる必要があります。@TARGETで最初に指定したディレクトリは@categoryで指定する最初のカテゴリになります。
「@TARGET=('../canon/*.html','../chinon/*.html');」なら「../canon/*.html」を最初に指定し、「../chinon/*.html」は2番目に指定します。ここで指定する番号が次の「option value=XX」の番号に対応します。
で、どの番号がどんなカテゴリなのか指定するために、次の部分を書き換えます。
# カテゴリーの各値(value)を@categoryの指定と一致させる
# value=0は必ず "全て"(All) 指定
print "<br> カテゴリー </strong></font><select name=menu size=1>";
if($menu==0) { print "<option selected value=0>全て</option>"; }
else { print "<option value=0>全て</option>"; }
if($menu==1) { print "<option selected value=1>研究活動</option>"; }
else { print "<option value=1>研究活動</option>"; }
if($menu==2) { print "<option selected value=2>日記</option>"; }
else { print "<option value=2>日記</option>"; }
if($menu==3) { print "<option selected value=3>その他</option>"; }
else { print "<option value=3>その他</option>"; }
ここここ、これを26種類分書き換えねばならないわけで…(うちの場合メーカー名となるので26ディレクトリすべてが別々ということになる)。根性がつきたので、@categoryの指定の方を書き換えました。キヤノンとチノン以外は全部その他、つまり3にしちまいました<(_ _)>
ここは本来、1〜26までちゃんとカテゴリ名(メーカー名)を指定してやらなくてはいけません。
ディレクトリの再帰処理をしないようです。つまり、canonディレクトリの下にさらにcanon/newとcanon/oldというディレクトリがあった場合、「canon/*.html」という指定ではcanon/newとcanon/oldの中を探してくれません。その場合はちゃんと「canon/new/*.html」のようにディレクトリを指定する必要があります。ただし、これについてはきちんと検証していないので間違っているかも、です。
- 設定にわからない部分があります。
# $maxline : 検索対象ページからの検索ライン数(行数)
# $maxbytesに達するぎりぎりの値を指定
$maxlines = 45;
# $maxbytes : 検索対象ページからの出力するタグを除く有効文字バイト数
# 多ければ多いほど実行効率が低下
$maxbytes = 300;
という部分です。検索結果の表示に関することだとはわかるんですが、特に$maxlineは謎です。「検索対象ページからの検索ライン数(行数)」ってなんのことでしょう? $maxbyteの「検索対象ページからの出力するタグを除く有効文字バイト数」もよく判りません。もう少し詳しい説明がほしいところです。
- フォルダを作ってそこに2つのファイルを放り込み、いっきにFTPでサーバにアップします。
かっこ内はパーミッションです。ここでは「wasearch」というディレクトリの中にまとめていますが、一般的には「cgi-bin」ディレクトリにまとめるとよいでしょう。
wasearch(755)格納ディレクトリ
+-wasearch2.cgi(755) 検索cgi
+-jcode.pl(644) 日本語処理用外部ファイル
僕の最大の興味はスコア付けです。
キーワード:性能表
絞り込み検索:すべての単語を含む
カテゴリ:キヤノンという条件で検索してみました。
score:5となったAUTOBOY F XLは本文に「性能表」という言葉が5つ入っていました(タイトルを含めると6つある)。
score:2のAUTOBOY Fは本文中には「性能表」という言葉は1つだけ(タイトルには1つある)。
そのほかはscore:1となり、本文中には「性能表」という言葉はなくタイトルには1つでした。
つまり、そのファイルに何回キーワードがでてくるかカウントして、これをスコアにしているように見えます。わからないのがscore:5となったAUTOBOY F XLです。score:6とならないといけないと思うのですが(本文5+タイトル1)、そうなっていません。本文中にでてくる「性能表」という言葉のうち、1つだけはリンクになっています。もしかしたらこれが原因かもしれません。
ソースを覗いてみると、やはり何回キーワードの言葉がでてくるかカウントしているようです。
当たり前ですが、カテゴリを絞って検索するとスピードは速くなります。
また、検索するキーワードが増えると、スピードは遅くなります。
これらはgrepタイプということから容易に想像できる結果で、順当なものです。英数字の場合、全角・半角の区別をします。「Nikon」と「Nikon」では検索結果に違いがでるということです。
まとめ
カテゴリの設定に手間がかかりますが、カテゴリを指定して検索する場合は、これが威力を発揮して、全体からの検索よりも相当高速です。何せ覗いて回るファイル数が激減しますから。
ナンバリングが最初からサポートされているのは嬉しいです。
検索結果で、該当キーワード部分が表示され、キーワードに着色されるのはいいですね。設定に不明な部分があるので、もう少し詳しい説明書がほしいところです。が、設定自体は難しいことはなく(ディレクトリ数が多いと面倒ですが)、パーミッションの設定さえ間違えなければあっさり設置できるはずです。
カテゴリに分けた検索をよく使いそうな人、ランク表示のほしい人にお勧めです。
●テストに使ったWASearchの改造箇所のメモです。例によって下のメモはオウンリスクでお願いします。くれぐれも作者の鷲崎 弘宜さんにこのメモについての質問など、ご迷惑のかかることはしないで下さい。
- CPU消費時間の表示。※改造済み。下記参照。
この機能は別に他の人は必要ないでしょう。僕の場合、他のサーチエンジンと比較したいのでつけたいわけです。
- 対象ファイルをeucにする。※改造済み。下記参照。
簡単な改造で済みます。
赤い部分が改造した部分です。
次の2箇所を改造し、サブルーチンを一つ追加します。
●オリジナル 一番最初
#!/usr/local/bin/perl
●改造後
#!/usr/local/bin/perl
### 計算時間測定開始・水沢
### スクリプトの頭の方に書く・水沢
$CPU_start = (times)[0] ;#・水沢
●オリジナル 261行目付近
# 出力するHTMLファイルの最後の表示サブルーチン sub last_html { print <<EOF; <hr> <p><a href=$backhome>戻る</a></p> </body> </html> EOF }●改造後
# 出力するHTMLファイルの最後の表示サブルーチン sub last_html { print <<EOF; <hr> <p><a href=$backhome>戻る</a></p> <!--■水沢改造</body></html>■--> EOF ### 計算時間測定終了### スクリプトのHTML出力部分に書く $CPU_end = (times)[0]; printf("<DIV align=right>消費時間: %.3f CPU秒</DIV>\n",$CPU_end-$CPU_start); printf("</body></html>"); # 水沢改造 }
次のように改造しましたが、これで大丈夫という保証はないです。「検索テスト」を見る限りでは無事に動くようです。
なお、wasearch2.cgi、jcode.plともeucで保存し直してください(配布状態では両方SJIS)。
●オリジナル 46行目付近
foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; &jcode'convert(*value,'sjis'); if ($name eq 'word') { $str = $value; $value =~ s/(\W)/\\$1/g; } $cgi{$name} = $value; }●改造後
foreach $pair (@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; &jcode'convert(*value,'euc'); # 水沢・変更 if ($name eq 'word') { $str = $value; $value =~ s/(\W)/\\$1/g; } $cgi{$name} = $value; }
ホーム >HTMLに役立つヒント>
WASearch2導入記