homeホームHTMLに役立つヒント> msearch導入記

msearch導入記

これはKatsushi Matsudaさんの開発した全文検索システム、msearch質問・要望掲示板も稼働中)導入記です。現在イチオシの検索エンジン!
2005/3/5 msearchはver.1.52にバージョンにアップ! 1.52はセキュリティアップデートとなっていますので、1.50/1.51のユーザーはアップデートしてください。「ディレクトリトラバーサルの脆弱性への対応」参照のこと。

作者のKatsushi Matsudaさんに感謝いたします。この文章はバージョン1.5xを対象にしています(従来の1.4xを対象にした文章はこちら、1.3xを対象にした文章はこちら、1.2xを対象にした文章はこちらで見られます)

「default.cfgの書き換え」でテスト検索できます。「検索テスト」も参照してください。

Unicode版msearchについて

「うちのホームページはUTF-8だからmsearchが使えないよー」とお悩みのあなたに朗報。

 毛流麦花さんが、msearchをベースに「Unicode版msearch」を開発されました。msearchはsjis/jis/eucコードにのみ対応ですが、Unicode版msearchはマルチリンガルになります。2004/4/15に正式版を配布開始!

携帯電話対応版について

 左に続いて朗報です。

 毛流麦花さんが、携帯電話からのアクセスに対応する方法を2005/9/22に掲載されました。詳しくは「msearchのケータイ対応化改造」を参照して下さい。CGIの改造が必要になるのでオウンリスクでどうぞ。

 なお、左で紹介しているUnicode版msearchは、Version 1.52(U2)から携帯対応となっているので改造の必要はありません。

このページに関する話題・ご質問などは「マニュアルに書いてない掲示板」へお願いします。

[このページの改定日: 06/12/16 15:44]  あなたはここへ来た、 209440番目の人です。(2001/8/2から)


■■ 目次 ■■

----- 導入編 ------

----- 応用編 ------


導入編


■msearchの特徴 ▲ページトップ

 msearchはスクリプト言語(perl)で書かれた、インデックスを作成するタイプの検索エンジンです。

 一般にgrepタイプ(HTMLを直接検索する)よりもインデックス作成タイプ(一度「目次/インデックス」ファイルを作り、これを検索する)の方が高速に検索できる、検索時のサーバの負担が軽いとされています。grepタイプはインデックス作成の手間がかからない点がお手軽でいいですが、検索スピードが遅く、サーバに負荷がかかります。

 しかし、これまで試したところでは、インデックス作成タイプであっても、grepタイプより検索が遅く、したがってサーバの負荷が高いものもあります。さてmsearchはどうでしょうか。

 なお、msearchはフリーソフトですが、営利目的の使用(有償でのレンタルや販売・設置代行等)の場合は作者の許可が必要です。その他、利用条件は作者のホームページをご一読ください。

 また、perlはver.5.x以上が必要です。4.xでは動作しません。

  

バージョン1.4xから1.5で機能強化・仕様変更された点は以下の通り。

●バグ取りと変更された機能

  • (1) 検索結果ページ数が1ページの場合に、ページジャンプの表示(cset)をなくした。
  • (2) ログ出力形式のフォーマット変数化($logformat)。
  • (3) 『( aaa bbb)』のようなor検索で文字化けするバグの修正。
  • (4) 『aaa b』のような検索式でハイライトが2重化するバグの修正。
  • (5) HTML中の非タグ文章『&lt;1章&gt;』が『<1章>』で検索可能に。
  • (6) genindex.plの非インデックスキーワードの問い合わせが変だったのを修正。
  • (7) genindex.plでランキングが効かなかったバグを修正。
  • (8) フォーマット変数$date_formatを$dateformatに変更。
  • (9) マッチ部分の抽出文字数を設定ファイルで指定可能に。

●機能された追加

  • (1) インデックスを切り替えて検索可能(ただし、一度に検索できるインデックスは一つだけです)。
  • (2) alt属性中の文字をインデックスに追加できるオプションがついた。
  • (3) インデックス管理メニューが追加された。

 今回の目玉は、管理機能搭載による導入の容易さをアップさせたことがひとつ。もう一つは複数のインデックスを切り替えて検索できるようになったため、ひとつのCGIで複数の検索エンジンをもてるようになったこと。これに付随して設定ファイルも指定することが可能になったため、一つのCGIで異なる画面デザインで動作可能になりました。

 他にもきめ細かな変更で使い勝手がアップしています。


■ファイルのダウンロード ▲ページトップ

msearchからmsearch.lzhをダウンロードしてくる。
 必要なファイルはこれだけなのでラクチンラクチン。30kb程度と非常に軽いです。手元で解凍します。lzhファイルですから、WindowsでもMacintoshでも解凍は簡単です。

 なお、lh7形式で圧縮されていますので、この形式の解凍をサポートしていないツール(例:StuffIt Expander)では解凍できません。


■インストール ▲ページトップ


■インデックスを作る ▲ページトップ

msearch用インデックス作成フォーム    msearch用インデックス補助ツール

インデックス名※1
対象ディレクトリ※2(必須)
対象ディレクトリのURL※3(必須)
対象ファイルの拡張子※4
非対象ディレクトリ※5
非対象ファイル※6
非対象キーワード※7
ランキング方法※8
alt文字の追加※9
パスワード※10(必須)
デバッグモード※11  


■検索する ▲ページトップ

●ブラウザでmsearch.cgiにアクセスします。

 速!! ウ〜ム、まさにぶっぱやいです。リターンキーを押した瞬間にお返事が返ってくる感じ。すげー。

 ここまででインデックスの作成・検索が確認できたことになります。


■管理する ▲ページトップ

●管理といっても、ホームページの内容に変化があったらインデックスを作り直すだけです。

 インデックスを作ったときに入力した条件は、ブラウザのCookieに入っていますから(デフォルトでは60日間有効。変更可能)、同じ条件をもう一度入力するような不自由はありません(設定日数以上インデックスを作らないとまた入力しなくてはいけませんが)。

 ブラウザでgenindex.cgiにアクセスし、パスワードを入力して「インデックス作成」ボタンを押すだけです。ラクチンラクチン。14ファイルを更新するのに5〜10秒程度ですみました。

 インデックスづくりが速いのにも驚き。他のインデックス型だと、この程度(対象ファイル数807程度)でも2〜15分程度かかります。それが1分ほどで済みます。これは管理の手間が大幅にかからないことを意味していますし、同時にサーバの負担もそうとう減っていることと思います。


■導入のまとめ ▲ページトップ

●インストール

 インストールは非常に簡単です。何かCGIを設置した経験があれば5分もあればできてしまいます。「インデックス作成型は設置が難しい」というのが定説ですが、msearchにはあてはまりません。

 ただ、解説によるとファイル容量の制限があるサーバや、CGIにファイルを作らせないようなサーバでは運用は面倒になるようです。

 実際、msearch掲示板を見ているとサーバ制限に引っかかったことが原因と思われるトラブルが多く相談されています。この点がmsearchの欠点といえるでしょう。

●検索スピード

 さすがインデックス作成型! 速いです。見つかったファイル数の多い・少ないに関わらず、ともかく速いです。CPU消費時間を表示するように改造して、検索テストでmacwwwsrch.cgi(とほほさんのwwwsrch.cgiの改造版)と対決させましたので参照してください。速さがわかります(ver1.4から検索時間の表示が機能に加わった)。

 not検索、or検索、タイトル検索、URL検索と実力は十分です。
 or検索のやり方が()で囲むという方法で、他のソフトとは違っていますので注意が必要です。検索式を書くようなユーザーはヘルプを見るでしょうから、このあたりは大丈夫でしょう。

●インデックスの作成

 インデックスタイプはインデックスの作成時にサーバ負荷が高いものがあります。試したところでは、C言語タイプ・perlスクリプト含めて、msearchはインデックスの作成がもっとも高速です。

 現時点ではインデックススピード、検索スピードともperlタイプとしてはトップクラスです。

●総合

 中・小規模でインデックスタイプをお考えなら文句なくmsearchを推します。

 インデックス作成の手間があっていやだという方はとほほさんのwwwsrchをお薦めします(ver3.09以上)。


応用編


■インデックス補助ツール ▲ページトップ

 インデックス画面で表示されるインデックス補助ツールは、名前の通り「補助」のためのツールです。通常は使う必要はありません。

 補助ツールの機能を一通り説明します。

●各種情報の取得

 msearchの設置がうまくいかないときに使います。サーバや関連ファイルの状態を表示してくれます。msearch掲示板で相談するときに、ここに表示されるデータが必要になるかもしれません。ただし、ここに表示されるデータは、不用意に公共の掲示板に出すとまずい項目もありますので、取り扱いにはご注意。

check_ms.cgiもお試しください。

●インデックスの削除

 インデックス名を指定して、インデックスを削除できます。ランキング方法を変更する場合などは、いったん既存のインデックスを削除してからインデックスし直す必要があります。そのような場合に使います。

 また、後述の「インテックスの結合」の後、残ったインデックスを削除するときにも使えます。

●空インデックスの作成

 「インデックス作成フォーム」でインデックスファイルを作成できない場合、この機能を使って空のインデックスをあらかじめ作成します。その後、もう一度インデックスを作成してください。

 この機能は、「インデックス作成フォーム」で使われているファイル作成とは違う手法を用いてインデックスファイルを作成しようとします。しかし、この機能を使ってもファイルを作成できないケースもあります。

 その場合はローカルマシンであらかじめ空のインデックスファイルを作り、FTPでアップロードするしかありません。パーミッションの設定を忘れないようにしましょう。

●インデックスの結合

よくあるトラブル/インデックス対象のファイル数が少ないとインデックスできるのに、ファイル数が多くなるとインデックス作成に失敗する」で説明しているように、サーバの制限に引っかかって、一度に大きなインデックスを作れない場合に使います。

 サーバの制限に触れないように小さなインデックスをたくさん作り、後でこれらを1つのインデックスに結合する、という手順になります。

1. 小分けしてインデックスを作る。

「インデックス作成フォーム」でインデックス名を指定しながら、サーバの制限に引っかからないようにディレクトリを小分けしてインデックスを作成します。

2. インデックスを結合する。

 できあがった小分けインデックスを、「インデックスの結合」機能を使って一つのインデックスに結合します。

 この機能はmsearch.cgiのあるディレクトリの中のすべての「○○.idx」を、ひとつのインデックス(default.idx)に結合します。結合機能だけですので、元の小分けインデックスは残っていますので注意。

 ただし、この方法を使うより、ローカルサーバを立てて、一気にインデックスした方が楽だと思います。「よくあるトラブル」参照のこと。


■ver1.4からのバージョンアップ ▲ページトップ

 インデックスファイルの切り替え機能、スキンファイルの切り替え機能の搭載などによって、これらのファイルの名前が変更されています。

 インデックスファイルは「mindex.dat」だったものが、任意の名前に変更可能となりました。特に指定しない場合は「default.idx」という名前になります。通常はこの名前で使うとよいでしょう。

 なお、1.4と1.5のインデックスは名前が違うだけでフォーマットは同じです。

 スキンファイル(設定ファイル)も「config.dat」から「default.cfg」に変更されました。加えていくつか埋め込み変数が追加されています。できれば1.5用に書き換えましょう。


■allow.plについて ▲ページトップ

 ver.1.52からは、セキュリティのために設定ファイルとインデックスの置けるディレクトリはmsearch.cgiのあるディレクトリだけに制限されました。このため、それ以外のディレクトリに設定ファイルやインデックスファイルをおけなくなりました。

 サーバの制限などによってインデックスファイルを別の場所に作らなくてはならない場合などは、この制限を受けてしまいます。

 そこで、「このディレクトリにある設定ファイルとインデックスファイルにはアクセスを許可してね」と指定するのがallow.plです。

●設定方法

 allow.plをテキストエディタで開きます。次の部分を編集します。

@g_allow = (
	    "./",          # これは必ず残しておいて下さい
	    "testdir/",
	    );

赤の「"./"」は削除してはいけません。青の「"testdir/"」部分を変更します。ここにはmsearch.cgiからの相対パスで指定します。

 例えば、msearchの下にあるaaaaというディレクトリ(msearch/aaaa/)の中にインデックスがおいてあるのであれば「"aaaa/"」という指定になります。

 msearchディレクトリの外にあるbbbbというディレクトリ(msearchディレクトリと同じ階層)にインデックスがおいてあるのであれば「"../bbbb/"」という指定になります。

 必ず最期に「/」が必要です。

  @g_allow = (
        "./",
        "aaaa/",
        "../bbbb/",
        );

 このような指定になります。


■msearchの限界? ▲ページトップ

(この項目の評価は1.3で行ったものですが、1.5でも基本的に同じです。)

 どの程度の規模まで実用になるのかテストしたいと思い、genindex.cgiとmsearch.cgiを改造して、きのぼず掲示板システム(掲示板一覧)の「コンパクトカメラ掲示板1〜6」のインデックスを作ってみました。きのぼずシステムはタイトルをデータベースファイルが持っていて、発言内容はそれぞれ1発言1ファイルの独立ファイルとなっています。インデックスの際に両者を合体させる必要があるため、genindex.cgiとmsearch.cgiとも改造しました(土台にしたのはmsearch 1.3β3)。

 インデックスには約15分かかりましたが、これは処理中のファイルを表示させるようにしたため、転送でかなり時間を食われています。後述のようにサーバの処理速度の違いもあり、参考にはなりません。ちなみにこのインデックス作成報告画面のソース保存してみたら、1.1MBありました。ムチャでんがな(^^;

 インデックスしたファイルの数は10,831ファイルで、インデックスの大きさは10,348kとなりました。10.1MBということですね。ウ〜ム、デカい。
 ここで注意が一つ。何しろ掲示板の発言ファイルですので、一つ一つのファイルは小さいです。1ファイルの容量は1kもありません。通常のhtmlファイルよりだいぶ小さい規模だという点に注意してください。ファイル数で見るよりインデックスの大きさで見た方がよいと思われます。

 最初、そのままamaysサーバでテストしましたが、どうも遅い。それに、サーバが違うのでこれまでのテストと比較ができないことから、インデックスをcgi.kiwiサーバに転送してテストしてみました。

検索単語

20件表示 amays 20件表示 cgi.kiwi
1単語 写り ヒット数:921件
CPU秒:5.840
ヒット数:921件
CPU秒:1.344
ライカ ヒット数:547
CPU秒:3.800
ヒット数:547
CPU秒:0.867
GR1 ヒット数:894
CPU秒:12.860
ヒット数:894
CPU秒:3.109
2単語
AND検索
ライカ C1 ヒット数:47
CPU秒:4.460
ヒット数:47
CPU秒:1.062
コンタックス ティアラ ヒット数:18
CPU秒:5.920
ヒット数:18
CPU秒:1.578
写り GR1 ヒット数:144
CPU秒:6.910
ヒット数:144
CPU秒:1.500
3単語
AND検索
コンタックス ティアラ リコー ヒット数:6
CPU秒:4.550
ヒット数:6
CPU秒:1.117

 ウ〜ム、amaysサーバで動かすには明らかに無理がありますが、いつものcgi.kiwiサーバではそこそこのスピードで動いてしまう(さすがにcgi専用サーバ!)。サーバ環境というのは大事ですね。ざっと4倍程度の処理速度の違いがあります。はじめて知った。

 それにしても恐るべし、msearch。サーバによっては10MBのインデックスでもこれだけのスピードで動くんですね。さすがに1秒以上の時間がかかることから実用上は疑問符がつきますが、半分の5MB程度なら十分いけそうです。

 コンパクトカメラデータページは、現在694ファイルあって、インデックスは1,091kです(1ファイル平均1.6k)。仮に5MBを限界とすると(オイオイ、5MBの根拠がないぞ)、1,024k×5/1.6k=3,200ファイルあたりまで使えそうだということになります。

 cgi.kiwiでは10MBはすでに限界といっていいようです。
 単純に、検索スピードがインデックス容量に左右されると仮定すると、amaysでは10,348k/4=2,587kですでに限界が来ているだろうということになります。

 検索ソフトの導入には、ご自分のサーバでスピードテストをしてみることをお薦めします。
 それにしても、限界テストというより、サーバテストになっちゃったな(^^;


■インデックスを自動更新 ▲ページトップ

●genindex.plとサーバのcron機能を使う

 この方法はmsearchのFAQに書かれています。
 telnetができることと、cron登録が許されている事が必要です。

 FAQに補足します。
 「======== shスクリプトの例 =======」に名前を付けて保存します。FAQにあるように「autogenindex.sh」とでもすればよいと思います。ファイルはgenindex.plと同じディレクトリにおきます。漢字コードはEUC、改行コードはLF、パーミッションは755にします(genindex.plも同じです)。

 telnetで該当のディレクトリにいき、「./autogenindex.sh」と打ち込んでテストしてみてください。無事にインデックスが更新されたら、次はcronへの登録です。

 cronへの登録はちょっと面倒です。「マニュアルに書いてないNAMAZU/毎日午前7時にインデックスを更新する」でcronへ登録する方法を解説していますので、参照してください。

 なお、テストしたところ、telnetでshファイルから実行させるより、ブラウザからcgiを使って更新した方が高速に処理できました。690ファイルをtelnetでshファイルによって新規にインデックスを作った場合約3分、ブラウザから新規に作った場合、約20秒程度でした。

 このあたり、ちゃんとtelnetでテストしてあなたのサーバでのスピードを把握した上で導入することをお勧めします。もしcron登録するなら、サーバ負荷の減る明け方6時頃がよいでしょう。

●cron登録、またはtelnetが許されていない場合

 やや強引ですが、手元のコンピュータを起動しておき、時間指定ツール(cron系アプリ)で インターネットに接続 → ブラウザを起動 → genindex.cgiにアクセス → 設定を入力 → 送信、という一連の動作を自動で行うという手があります。

 「cron系ツール」とは、UNIXのcronと同じように、一定の時間になると自動的にアプリケーションやファイルを実行してくれるツールです(Vectorあたりで検索すると良いでしょう。さもなければgoogleとか)。

 これらを利用してブラウザを立ち上げ、自動的にタイピングしてインデックスを作らせるというわけです。僕はMACなのでWindowsでこうしたことが実際に可能なのか不明です。

 Macintoshならcron系ツール、ブラウザ、AppleScriptの組み合わせで可能です。AppleScriptの雛形は「msearch_index_122.txt」をクリックすると表示されます(ver1.22。msearch 1.5対応版。このスクリプトは使用・改変・再配布自由です)。コピーしてAppleScript編集プログラムにペーストし、設定を変更してお使いください。「classic/OS Xアプリケーション」として保存するといいでしょう。設定によって、小分けインデックスの作成にも使えます。

 このAppleScriptでやっているのは、単純にCGIに渡すフォームデータを生成し、ブラウザを使ってCGIに送っているだけです(ver.1.2でブラウザを使わない方法を選択可能になった)。したがって、cron系アプリでインターネットに接続し、次にこのAppleScriptを実行させてください。AppleScriptは自動的にブラウザを立ち上げて送信します。

 おまけ:「msearch_idx_conv_1.txt」小分けインデックスを合体させるAppleScript。
 おまけ2:「msearch_idx_ctl_1.txt」msearch_index_xx、msearch_idx_conv_xx(上のおまけ)を連続して走らせるためのAppleScript。

 もし自分でAppleScriptをかけるなら、時間が来たら自動的にスクリプトを実行するように変更するのも簡単です。


■Tips 〜運用時 ▲ページトップ

●全件ヒットさせる。

 これは掲示板でKatsushi Matsudaさんに教わりました。「キーワードに「-ほんがらげー」のような絶対に1件もヒットしないキーワードのNOT検索にする」と全件にヒットします。同時にこの方法ではヒットするキーワードがありませんから、強調表示もしません。「全件ヒットさせたいけど、強調表示はいやだ」という場合に有効です。

●特定のディレクトリだけ検索させたい

こんな構造だとして、

html
 ├Aディレクトリ
 ├Bディレクトリ
 ├ …

普段は全ディレクトリを検索させ、ユーザーの好みでAディレクトリ、Bディレクトリの中だけ検索させたい、なんて時に使います。

msearchの「uオプション」機能を利用して、検索単語の中に「u:/Aディレクトリ/」なんて具合にディレクトリを含ませちゃえばいいわけです。よーするにこういうことです。


 これ、msearchの検索窓の前に次のタグを追加しただけです。これで「/A/」または「/B/」を含んだディレクトリだけ検索できます。cgiに手を入れる必要はなく、スキンの変更だけで実装可能です。

 ポイントはvalueに半角スペースをいれてからuオプションを記述することです。
<SELECT NAME="query">
<OPTION SELECTED>ディレクトリ選択
<OPTION VALUE=" u:/A/">Aディレクトリ
<OPTION VALUE=" u:/B/">Bディレクトリ
</SELECT>

 これを応用したのが「簡単検索」機能で、あらかじめ検索頻度の高いキーワードを複数選択できるようにしたものです。

 簡単検索の具体的なスキンの変更方法は、スキンの配布を参照していただくとより参考になるでしょう。

 なお、ver.1.5からはインデックスの切り替え機能が付きましたので、Aディレクトリ、Bディレクトリ別々に検索するなら、この機能を利用する方法もあります。ただし、一度に検索できるインデックスは1つだけですので、この機能を使った場合、A、Bディレクトリ両方を一度に検索できません。

●altタグなど本文にでてこないキーワードをヒットさせたい。

 msearch ver.1.5からaltタグがサポートされましたので、altタグを検索させたい場合はインデックス時に「alt属性の文字をインデックスに含めますか?」を「含める」にしてインデックスを作成します。

 また、altタグ以外にも使えるテクニックとして、秀逸なアイディアをmsearch掲示板でseamusさんが考案されました。詳しくは612番「本文以外の文字を検索に引っ掛けるには?」のスレッドを参照してください。

●and検索、or検索別の検索窓を設けたい

m_andor.cgi」を参照してください。

 and検索/or検索別々の入力欄からキーワードを受け取り、or検索用の整形を施してmsearch.cgiに入力を渡す自作CGIがダウンロードできます。改変等は自由ですのでガシガシ改造して使ってください。

 同様のことをCGIを使わずに実現する、JAVAscript版も追加しました(2003/8/20)。

 さらに、発展させた「詳細条件入力」なんて物も作ってみました(2003/8/21)。

●複数の検索エンジンを設置したい(インデックスの切り替え)

 msearch ver.1.5から、インデックスの名前を指定してインデックスする事が可能になりました。CGIを呼び出す際に「msearch.cgi?index=インデックス名」とすると、指定したインデックスを検索します。このとき指定するインデックス名に「.idx」という拡張子はいりません。「test.idx」を指定するなら次のようにします。

例:<form action="/cgi-bin/msearch.cgi"><input type="hidden" name="index" value="test">

 この機能を利用することで、ひとつのCGIで複数の検索エンジンを設置することが可能です。コーナーごとに検索を分けたいときなどに有効でしょう。

 なお、複数のインデックスを一度に検索することはできません。一度に検索できるのは1つのインデックスだけです。

●スキンを変更したい

 前項、インデックスの指定と同時に、スキン(.cfg)を指定することも可能になりました。別の検索エンジンなら(インデックスを切り替えるなら)見栄えも変更したいでしょうから、その時はこの機能を使います。指定方法はインデックスと同じです。「test.cfg」を指定するなら次のようにします。

例:<form action="/cgi-bin/msearch.cgi"><input type="hidden" name="config" value="test">

 一般的には、インデックスの指定と同時に使うとよいでしょう。こんな感じ。

例:<form action="/cgi-bin/msearch.cgi"><input type="hidden" name="index" value="test"><input type="hidden" name="index" value="test">

 さて、実はインデックス名と同名の設定ファイル名がある場合は、これを省略することができます。

例:test.idxとtext.cfgがある場合はこんな感じ。
<form action="/cgi-bin/msearch.cgi"><input type="hidden" name="index" value="test">

●idxやcfgをURL指定(GETメソッド)するときの書式

 HTMLではなく、URL形式でCGIに引数を渡す場合は、次のような法則があります。

例:http:/aaa.co.jp/cgi-bin/msearch.cgi?index=test&config=test

 このように、cgi名の後に「?」をつけて引数を指定します。「?」の直後であればそのまま「index」や「config」といった変数名(指定項目)を書き、続いて「=」で結んで指定します。「変数名=指定値」というセットになるわけです。「msearch.cgi?index=test」の部分です。

 さて、さらに続いて別の指定項目をつけたいときは、今度は「&変数名=指定値」というように「?」ではなく「&」でつないでやります。「msearch.cgi?index=test&config=test」の部分です。

 以下、この繰り返しになります。ページあたりの表示件数「num」を加えると次のようになります。

例:http:/aaa.co.jp/cgi-bin/msearch.cgi?index=test&config=test&num=20

 この法則はmsearchだけでなく、GETメソッドを許可しているCGI一般に共通です。


■トラブルシューティング(一般的なチェック) ▲ページトップ

●一般的なチェックポイント。

 「CGI設置入門/トラブルシューティング」などを参照しながらCGI一般に当てはまる基本的なチェックをしてください。

 msearchの解説ももう一度読んでみましょう。msearchのFAQも読み逃さないようにしてください。msearch掲示板を見ていると、案外FAQが読まれていないようです。

●チェックツール(check_ms.cgi)を使う。

 msearchを設置する際のチェックツール(check_ms.cgi)を作りました。ver.1.5からは「インデックス補助ツール」に同じような機能が付きましたが、このツールを併せて使用するとさらに便利かと思います。

変更履歴

・2003/7/25 ver.2.18リリース。 ver.1.5対応。
・2002/1/28 ver.2.17リリース。 ver1.4対応。jcode.plが利用できない場合、漢字コード/改行コードの判定を表示せずに終了するバグををフィックス。
・2001/10/23 ver2.16リリース。 最初の公開バージョン。

使い方
  1. check_ms218.txtをクリック。(msearch ver1.5対応版です。1.4には使えません。)
  2. 表示内容をコピーし、テキストエディタにペーストします。必ず漢字コード/改行コードをコントロールできるテキストエディタを使ってください。
  3. 中の説明にしたがって設定部分を変更します(最大3箇所。普通は2カ所)。
  4. これを「check_ms.cgi」という名前で保存します。保存の際に漢字コード/改行コードをEUC/LFにして下さい。
  5. msearch.cgiと同じディレクトリにアップロードします。
  6. パーミッションを755にします(標準的なサーバの場合。サーバによって異なります)。
  7. ブラウザでcheck_ms.cgiにアクセスするとチェックしてくれます。おかしな部分は赤字で表示されます。

 このTOOLを使うことで、ほとんどのミスは発見することができます。このTOOLでも発見できないのは、サーバがcgiに対して行っている特殊な制限だけです(のはず)。詳しくはツールを動かして解説を読んでください。

 このツールは水沢・penguin-19・和彦が作ったもので、msearchの作者Katsushi Matsudaさんとは関係ありません。check_ms.cgiについての不具合、説明がちんぷんかんぷん、ここがわからない、などは水沢・penguin-19・和彦までお願いします。「マニュアルに書いてない掲示板」でもけっこうです。

●msearch掲示板で相談する。

 最後に、msearch掲示板で相談するという手があります。もともとバグ情報や次期バージョンの要望などを作者に伝えるための掲示板ですが、設置についても相談に乗ってくれます。作者にサポートしてもらえるというのは心強いものです。

 ただ、この手のサポート掲示板の礼儀だけは守りましょう。質問の前に、必ず以前自分と同じ症状の相談がなかったか調べてください。「msearch掲示板で過去にあった事例」も参考にしてください。

 相談の際には、
 ・どのバージョンを使っているのか、
 ・どんな不具合があるのか、
 ・どんなチェックをしたか、
 ・サーバ環境などはどうなっているか、
  など、できるだけ正確に、具体的に書きましょう。

 症状を具体的に書くことは大事です。「CGIが動きません。誰か助けて」だけではまったくわかりません。ブラウザでアクセスしてもまったく反応がないのか、動作はするけどエラーがでるとか、エラーがでるならどんなエラーで、エラー番号(通常ブラウザの一番上に表示されます)はなにかとか、状態がわかるように書きましょう。

 アドバイスがあったら、アドバイスの何を実行して何を実行しなかったか、実行の結果はどうだったか、キチンと報告するようにしましょう。

 結果報告も具体的に書くように心がけてください。「うまくいきませんでした」では、何がどううまくいかなかったのかわかりません。「アドバイスをいただいた○○を試しましたが、結果は××となり、うまくいきませんでした」というふうに具体的に書きましょう。

 これを怠ると、状況を正しくつかめないばかりでなく、同様の症状にみまわれた他の人の参考になりません。サポート掲示板はいわば「自分たちで作るFAQ」ですから、自分だけが解決すればいいという態度は捨てて、他の人にも役に立つように掲示板に書き込むように心がけましょう。


■よくあるトラブル(トラブル別) ▲ページトップ

 よくあるトラブルの解決法を書きます。「msearch掲示板で過去にあった事例」も参考にしてください。

●indexが作れない

 genindex.cgiにブラウザでアクセスし、「インデックス補助ツール」画面の「空インデックスの作成」で、空のインデックスファイルを作れるかどうか試してください。このツールでは3種類の方法で空インデックスの作成にトライするそうです。

 補助ツールでも空のインデックスファイルが作れない場合は、手動で作ってやります。手元で空っぽのdefault.idxファイルを作って、FTPでアップロードし(genindex.cgiと同じディレクトリに入れて、パーミッションを666にします)、もう一度インデックスしてください。

●インデックス対象のファイル数が少ないとインデックスできるのに、ファイル数が多くなるとインデックス作成に失敗する。

 CGIには、最大使用メモリ、実行時間、最大同時実行プロセス数などさまざまな制限があります。サーバによってこれらの制限値は異なっています。この制限に引っかかるとCGIは強制的に終了させられます。

 msearchのインデックス作成には大きなメモリが必要となりますし、時間もかかります。従って、インデックスを作るときが一番サーバの制限に引っかかりやすいです。

 インデックス対象ファイル数が少ないとインデックスが作れる場合は、動作自体はしているわけです。ファイル数を多くしたとたんにインデックスできないとなると、なんらかのCGIの制限にひっかかってしまったということです。

 こうなるとサーバ上で一気にインデックスを作ることはできません。次のような対処法があります。

1. telnetが許されているなら、genindex.plを使ってサーバ上でインデックスを作る。

 msearchの「インストール方法6番」の最後参照。telnetして手動でgenindex.plを起動し、質問に答える形でインデックスの作成ができます。

2. telnetが許可されていない場合は、次の2つの方法があります。
2-1 サーバ上でインデックスを小分けして作成し、手動で合体させる。

 msearchのFAQ4番のcを参照してください。

 インデックスが作れる範囲で小分けしてインデックスを作ります。たとえば、次のようなディレクトリ構造だとします。

html
 ├aaa
 ├bbb
 ├ccc

 htmlディレクトリ全体ではファイル数が多すぎていっぺんにインデックスができない場合、「html/aaa」「html/bbb」「html/ccc」のように少しずつインデックスを作ります。全部インデックスできたら、genindex.cgiの「インデックス補助ツール」でひとつのファイルにまとめます。

 msearch掲示板で素早く小分けインデックスを作成する方法が紹介されています。「小分けインデックスを素早く作る方法863番

 telnetができるなら、genindex.plとshファイルを使って小分けインデックスを連続作成するようにするといいでしょう。

 あなたがMacintosh使いなら、「インデックスを自動更新」で紹介したAppleScriptを使って、小分けインデックスを手軽に作ることができます。


2-2 手元のマシンでローカルサーバを立て、手元でインデックスを作成し、サーバにアップする。

 msearchのFAQ4番のdを参照してください。

 サーバの立て方は、windowsならあちこちに解説ページがありますのでgoogleなどで検索してみてください。MACならOS Xである必要があります(msearchの動作にはMAC perlではなくUNIX perlが必要なので)。「MAC OS X Darwin Tips」などを参照してください。

 2-1と2-2では、2-2の方が圧倒的に楽です。一発でインデックスできますし。

●検索結果のキーワード欄の文字が化けている

 検索フォームをSJISで記述していると思います。EUCでフォームを書くと文字化けしません。1.4x以降ではこのトラブルはまずでないはずです。

●フレームを使っているので別フレームに結果を表示させたい

 フォームでtargetを指定してやります。「<form action="http://......." .... target="frameName">」とするだけです。「frameName」は表示させたいフレームの名前を指定します。

 フレームには対応する名前(<frame src="fileName" name="frameName">)を指定しておきます。

 targetタグはframeタグのnameオプションで指定された名前で目的のフレームを探します。したがって、2つ以上のフレームに同じnameが指定してあると、誤動作します。フレームの名前はダブっていてはいけません。

●「対象ディレクトリのURL※2」の指定がわからない
●検索結果のURLと実際のURLがずれる
●ローカルで作ったインデックスをサイトで使いたい

 「対象ディレクトリのURL※2(必須)」は検索結果のURLと実際のURLのズレを吸収する役目を持っています。

 CGIをどのディレクトリにでもおける場合はそれほど問題にならないと思いますが、cgi-binなど特定のディレクトリにおく必要がある場合は、検索結果画面でリンクされるURLと実際のURLがずれるケースがあります。

 例えば、検索結果でリンクされるURLが「http://www.aaa.jp/~name/cgi-bin/bbb.html」となり、該当するファイルのURLが「http://www.aaa.jp/~name/bbb.html」だったとしたら、インデックス時に「対象ディレクトリのURL※2(必須)」で「http://www.aaa.jp/~name/」と指定してやります。

 検索結果のURLが実際とズレる場合は、このURL指定が間違っているためです。ローカルサーバで作ったインデックスファイルも、「対象ディレクトリのURL※2(必須)」でアップするサーバのURLを指定してやればOKです。

 詳しくは「msearchのインデックス対象ディレクトリ指定」をご覧ください。

●times関数が使えないと表示される

msearch掲示板であった相談です。

「times not implemented at D:\_program\httpd108\public_html\cgi-bin\msearch142\msearch.cgi line 77.」のような表示がでてストップしてしまう場合は、お使いになっているperlに原因があります。

 msearch.cgiはUNIX perl用に書かれています。ところが、Windows向けに書かれたperlでは、times関数をサポートしていないものがあります。例えば次のようなperlです。

ActivePerl:ビルド5xx
 参照:http://www.harukaze.net/~mishima/perl/win/winperl.html

Perl for Win32:Pw32i3xx.exe
 参照:http://www.harukaze.net/~mishima/perl/faq/Evangelo/Perl_for_Win32_FAQ_5j.html

 他にもあるかもしれません。お使いのperlの解説を参照してtimes()関数が使えるか確認してください。こういうtimes関数を使えないperlを使っている場合は、msearch1.4以降はエラーがでます。
 対処法としては2通りあります。

1.times関数の使える別のperlに入れ替える。
2.msearchのtimes関数をつぶす。

 ここでは2.のやり方を説明します。この改造で、検索時間の表示機能がなくなります。

 行数はver1.42のものです。目安と思ってください。

 msearch.cgiの改造(4箇所)

●77行目 オリジナル
$v_cputime = (times)[0]; # かかった処理時間

●変更後
$v_cputime = 0; # かかった処理時間


●1106行目 オリジナル
### CPU時間の測定
###
sub getcputime {
my $cpu_finish = (times)[0];
$v_cputime = $cpu_finish - $v_cputime;
}

●変更後
### CPU時間の測定
###
sub getcputime {
my $cpu_finish = 0;
$v_cputime = $cpu_finish - $v_cputime;
}

(ここまでの改造で検索時間の計算部分をつぶしているので、cgi自体は動くようになります。次に、無駄な表示部分を殺します。)


●1213行目 オリジナル(sub printpageの中)
$f_page[$i] =~ s/\$\$cputime\$\$/$v_cputime/g;

●変更後(下記のようにコメントアウトするか、この行を削除する)

#$f_page[$i] =~ s/\$\$cputime\$\$/$v_cputime/g;


●1252行目 オリジナル(sub printhelpの中)
$f_help =~ s/\$\$cputime\$\$/$v_cputime/g;

●変更後(下記のようにコメントアウトするか、この行を削除する)

#$f_help =~ s/\$\$cputime\$\$/$v_cputime/g;


 default.cfgの変更(2箇所)

 検索時間の表示部分「検索にかかった時間$$cputime$$秒」という部分を削除します。残しておいてもいいですが、そのまんま「$$cputime$$秒」と表示されてしまいます。

 実は、ActivePerlにしてもPerl for Win32にしてもtime関数は使えるようなので、最初はtimes関数をtime関数に入れ替えようと思ったのですが、これだと意味がないことに気がつきました。

 timesがプロセス時間を計るのに対し、timeは現在時刻を返しますので、精度は秒単位までなんです。したがって検索スピードが1秒以下だと正しく計測できません。「検索にかかった時間:0秒」とか表示されちゃうはずです。っっって、msearchで1秒以上時間がかかるケースってまずないでしょ(^^; 意味ねーってわけです。

 もしmsearchで1秒以上かかるなら、サーバ負荷からいって、もっと高速なエンジンに入れ替える必要があります(ローカルならこの限りではないでしょうが)。


■default.cfgの書き換え 〜画面デザインの変更 ▲ページトップ

●ver.1.4からはスキンファイルを変更するだけで機能の設定、画面デザインの変更などが手軽に行えるようになりました。以下のスキンはver.1.5用(default.cfg)です。1.4x用のスキン(config.dat)はこのページのトップから1.4xの解説ページをご覧ください。1.5と1.4ではスキンファイルの名前が違いますのでご注意。

スキンの配布:本家msearchページでもスキンを配布していますので参照してください。

 なお、ここで配布しているスキンについてのご質問などは、「マニュアルに書いてない掲示板」へお願いします。

●スキンファイルについて

 以下の各.cfgファイルは、特に断り書きがない限りver.1.5以降用です。それ以前のmsearchで使うとサポートしていない埋め込み変数があるためにうまく動作しません。
 以下の.cfgファイルは、ことわりなく改変して使用してかまいません。ガシガシ変更して使ってください。

●使用している画像について

 以下のスキンで使っている画像は、すべて僕のオリジナルです。ご自由にお使いください。自由に変更できるようにソース画像付きのものもありますから、適当に改変するとよいでしょう。

●サンプル画面について

 ver.1.5から搭載された、スキンファイルの指定機能を利用しています。そのため、実際に検索機能を利用することができます。ただし、コンパクトカメラデータベースの検索となりますので、カメラっぽい言葉を入力してください。例として、検索結果画面では「キヤノン」を検索させています。

●簡単検索機能について

 簡単検索機能付きのものは、HTML版とJAVAスクリプト版を用意しました。selectタグを適当に変更してお使いください。HTML版はすべてのブラウザで使えますが、JAVAスクリプト版はJAVAスクリプトをサポートしていないブラウザでは動きません。

 簡単検索を削除したいなら、HTML版をダウンして、「<!--■ここから簡単検索■--> 〜 <!--■ここまで簡単検索■-->」までをさっくり消してしまえばよいハズです。JAVAスクリプト版はもうちょっと複雑。

タイプ1
HTML版 ヘルプ ●検索結果 ●cfg ●画像ファイル
JAVAscript版 ヘルプ ●検索結果 ●cfg
 ページあたり表示件数を指定できたり、簡単検索を実装したりしています。デザインはgooとgoogleを足して2で割ったような(^^; 必要充分って感じのスキンです。

タイプ2 ヘルプ ●検索結果 ●cfg ●画像ファイル
 検索結果1つ1つをテーブルタグで囲ったタイプ。地色を変更することで簡単に雰囲気を変えられます。もっともお手軽に雰囲気を変えられるスキンです。

タイプ3 ヘルプ ●検索結果 ●cfg ●画像ファイル
 タイプ3はシンプルな画面です。シンプルすぎて寂しい感じさえします(^_^) 現代人の背負った虚飾をすべて排除した渋い人向けのスキンです(ウソですけど)。

タイプ4 ヘルプ ●検索結果 ●cfg ●画像ファイル

 オリジナルキャラクター、msearch君がいるにぎやか版です。髪の毛が七色だったりピアスをしていたり、ちょっとパンキーなmsearch君です。

 msearch君の原画はこちら(Illustrator 5.5ファイル)です。

タイプ5 ヘルプ ●検索結果 ●cfg ●画像ファイル

 MAC OS XのAQUAインターフェースライクなデザインです。

 ボタンの原画はこちら(Photoshop 5.5ファイル)です。サイズを変更したり、色を変えたりしてアレンジして使ってください。サンプルとしてストロベリーやグラファイトに変更できるようにしてあります。

 アクア風ボタンの作り方は「AQUA風ボタンの作り方」参照。

タイプ6
HTML版 ヘルプ ●検索結果 ●cfg ●画像ファイル
JAVAスクリプト版 ヘルプ ●検索結果 ●cfg 
 タイプ5の自分用。MAC OS XのAQUAインターフェースライクなデザインで、簡単検索機能をつけたもの。

タイプ7 ヘルプ ●検索結果 ●cfg ●画像ファイル
 ソルトレイクオリンピック記念に作成した、「がんばれ日本」デザイン。使う人、いるかな〜(^^; 

タイプ8
HTML版 ヘルプ ●検索結果 ●cfg ●画像ファイル
JAVAスクリプト版 ヘルプ ●検索結果 ●cfg

 Macintosh OS Xのファインダー風のデザインです。まーまーきれいなんだけど、囲むとちょっとうっとうしいな、というスキン。簡単検索機能付き。

 ボタンとファインダーの原画はこちら(Photoshop 5.5ファイル)です。

タイプ9

9_1 HTML版 ヘルプ ●検索結果 ●cfg ●画像ファイル
9_1 JAVAスクリプト版 ヘルプ ●検索結果 ●cfg

9_2 HTML版 ヘルプ ●検索結果 ●cfg
9_2 JAVAスクリプト版 ヘルプ ●検索結果 ●cfg

 全国1000万(?)のペンギンファンに送る、ペンギンデザインのスキンです。9_1と9_2は検索結果の別窓マークのペンギンが異なるだけです。画像ファイルは共通。簡単検索機能付き。

 画像ファイルには「09penguin_suf.gif」〜「09penguin_suf5.gif」までバリエーションが入ってます。一番左が9_1で使っているもの、次が9_2で使っているものです。

 他のものに取り替えるときには、.cfgファイルを開いて、2-2「begin result 20」の次の部分を使用する画像にあわせて変更してください(下の例は9_2の場合)。
<img src="image/09penguin_suf2.gif" width="50" height="45" align="BOTTOM" border="0" alt="別窓で開く">

09penguin_suf.gif09penguin_suf2.gif09penguin_suf3.gif09penguin_suf4.gif09penguin_suf5.gif←隠しリンクがあるぞ。

 ペンギンの元絵はこちら(Illustrator 5.5ファイル)に置きます。アイディアはずいぶん前にでていたのに、実現するまでものすごい時間がかかった。理由はペンギンがうまくかけなかったから。この元絵ファイルは足かけ2年もかかっているのだ。心せよ! 結局図鑑見ながら描いたんですけど。

 2003/9/1 元絵を修正。ロボットペンギンを追加しました。
 2003/10/9 元絵を修正。メガネで出っ歯のカメラを持ったペンギンを追加。

ペンギンバリエーション

タイプ10
10 JAVAスクリプト版 ヘルプ ●検索結果 ●cfg ●画像ファイル

 今回はMacintosh OS Xのdashboardタイプ。今回は簡単検索のJAVAscriptスクリプト版のみとしました。いいかげんJAVAscriptが動かないブラウザを使っている人も少なくなったろうし。

 簡単検索がいらない場合は、該当部分をさっくり削除してください。head部分にJAVAscriptもありますので、これも削除してね。

 また、このスキンでは、検索結果表示部分でちょっとだけスタイルシートも使っています。

タイプ11
11_1  ヘルプ ●検索結果 ●cfg ●css 
11_2  ヘルプ ●検索結果 ●cfg ●css 
11_3  ヘルプ ●検索結果 ●cfg ●css 
11_4  ヘルプ ●検索結果 ●cfg ●css ●画像ファイル

 デザイン11の特長は、これまでと違いスタイルシートで見た目を変えられることです。

 11_1はベネトンカラーの派手なものになっています。デーハであります。目が痛いです(^_^) 

 まさか11_1のままの色で使う人はいないと思いますが、バックのカラーを変えただけでこんなに違う、ということで11_2であります。11_3はモノトーンでぐっと落ち着きました。CSSのカラー指定部分を変更しただけです。

 画像を使うとこんなこともできます。11_4です。

 これらの.cfgファイルは、指定しているCSSが異なっているだけで、あとは一緒です。CSSを使うとこういう具合にデザインを変えられるのが魅力。

 CSSファイルには簡単な解説を入れてありますから、検索結果画面のソースと見比べればだいたいわかってもらえると思います。CSSは一応MAC(OS 9/IE、OS X/IE/safari/FireFox)とWindows(IE6)で検証してあります。見た目は大きく違わないはず(CSSの欠点は、ブラウザによって解釈が微妙に異なるので、いちいち検証が必要なことですね。特に画像を使ったものは要注意)。

 例によってCSSも画像もご自由にお使いください。

●英語スキン(ver.1.46用です)

名前 サンプル コメント
english skin

search.htm
検索対象ページが日本語なのでナンですが、英語ページならちゃんと英語で表示されます。あたりまえか(^^;

help.htm

 このスキンははたのさん(Dissipation of Hawking,TOP←このページで同じスキンを配布しています)の制作です。英語表記についてまっとさんの助言を受けて制作されました。ご厚意でこのページでも配布させていただいています。はたのさん、ありがとうございました。

config.dat」をクリックして、でてきたテキストを「config.dat」という名前で保存してください。EUC/LFにするのを忘れないでね。

 なお、検索結果画面については問題ありませんが、ヘルプ画面で表示される「インデックスの最終更新日時」、「現在日時」の表記が日本語のままです。
 これを修正するには、msearch.cgiに手を入れる必要があります。次の2箇所を変更します。(行数は1.44の場合)

・1126行目
return("$year年$mon月$d日$h時$m分$s秒");

・1139行目
return("$year年$mon月$d日$h時$m分$s秒");

 上記の年月日時分秒部分を英語表記に書き換えます。

変更後 return("$mon/$d/$year $h:$m:$s");
 ↑月/日/年 時:分:秒という並びになるはずです。

●スキンデザインの方法

 画面のデザインはHTMLエディタでやった方が手っ取り早いです。「default.cfg」のうち、検索結果画面、ヘルプ画面の「<html>」から「</html>」までをそれぞれコピーして保存します。これをHTMLエディタで開いて画面をデザインします。できあがったらHTMLを「default.cfg」に書き戻してやります。「#」で始まるコメントは、じゃまならとってしまって良いでしょう。

 僕はAdobe PageMillというHTMLエディタを使って画面をデザインし、できあがったらテキストエディタで.cfgファイルにコピー&ペーストして貼り付けていく、という方法で作っています。こちらにデザイン中のファイルを置きますので、デザインの雛形ファイルとして使ってください。ソースを表示させるとわかりやすいと思います。

●ちょっとだけ「default.cfg」の書き換えについて解説します。詳しい内容は本家解説ページに説明がありますのでご一読ください。

 default.cfgは必ず漢字コードEUC、改行コードLFにしてください。漢字コードがsjisだと文字が化けますし、改行コードが違っているとエラーがでます。


1.変数の設定

 このあたりは見てもらえればわかると思いますのでさわりだけ。

 ここに記述されている変数はCGI本体にも書かれています。これがデフォルト値です。デフォルト値から変数を変更したい場合、CGI本体をいじらずに、default.cfgに書かれている変数を有効にして値を書き換えればよい仕組みになっています。

 行頭に#があると、その行はコメントとして無視されます。変数も行頭に#が付けられていて、最初はcgi本体内のデフォルト値を使うようになっています。変数を有効にするには、変数行の行頭の「#」を削除します。間違って説明行の「#」まで削除しないでね。バッチリエラーがでます。

 説明行があって、次に変数行があるという構成になっていますから、どれが変数行かはすぐにわかると思います。
 変数は「set命令 $変数名 = 変数の値」というふうに記述されていますので、変数の値だけを書き換えます。間違って変数名まで書き換えると役に立ちません。

・homeのリンク先を変更する。赤字の部分を自分のホームページURLに変更します。

# ホームページのURL(デフォルト="")
set $home=http://www.kiteya.net/

・検索結果のハイライトを<b>タグから赤い文字に変更する

# マッチキーワードのハイライトの書式(デフォルト=<b>) ←説明行。「#」は削除しちゃダメ
#set $highlight_deco=<font color=red> ←変数行。ブルーの部分が変数の値。

という部分の「#」を削除して

# マッチキーワードのハイライトの書式(デフォルト=<b>)
set $highlight_deco=<font color=red>

にします。もちろん「<font color=red>」を変えれば他の色にも変更できます。

・検索ログを出力したい。

# ログを出力するか(デフォルト=0(しない)) ←説明行。「#」は削除しちゃダメ
#set $log=1 ←変数行

という部分の「#」を削除して

# ログを出力するか(デフォルト=0(しない))
set $log=1

にします。デフォルトでは「」というファイルに出力されますが、ログファイルの名前を変更したい場合は次の行も変更してやります。

# ログファイルのファイル名(デフォルト=msearch.log)
set $logfile=new.log ←行頭の「#」を取って、好きな名前にする。


2.検索結果画面,ヘルプ画面(初期画面)のフォーマット

 いよいよ画面デザインの変更部分です。デフォルトのまま使う人が多いようですが、せっかく手軽に変更できるようになったので、ぜひ自分らしいデザインに変更して使いましょう。

 画面のデザインはHTMLで記述します。お手持ちのHTMLエディタで変更可能です。ただ、中には埋め込み変数を書き換えてしまうようなお節介なHTMLエディタがあるかもしれませんので、その点は注意してください。

 msearch.cgiは、ここで記述されたHTMLにしたがって検索画面・初期画面を出力します。このとき、例えば検索結果を出力したいところに「$$result$$」と書いておくと、msearchはこの部分に検索結果を出力してくれます。これが埋め込み変数です。


2-0. 埋め込み変数の説明です。埋め込み変数について解説していますので必ずご一読ください。
2-1. 検索結果画面のフォーマット

 ここでは検索結果画面のデザインをHTMLで記述します。画面をデザインして埋め込み変数を後ではめ込んでいくという方法でも、デフォルトデザインを元に変更するという方法でも好きなように変更してください。

 理解の助けになるように解説してみます。検索結果画面のデザインは必ず「begin page」で始まり、「end」で終わる必要があります。

begin page ←これは変更してはいけません。ここからスキンが始まるという合図。
<html> ←書き換えはこの行から
<head>
# ↓の2行は変更しない方が無難
<meta http-equiv="Content-Type" content="text/html;charset=$$encoding$$"> ←漢字コードが入ります。漢字コードは$encodingで指定します。
<meta http-equiv="Content-Language" content="jp">
<title>検索結果 powered by msearch</title>
</head>
<body bgcolor=white>
<center>
<form action="$$msearch$$" accept-charset="$$encoding$$"> ←msearch.cgiの名前と漢字コードが入ります
<table border=0 cellspacing=0 cellpadding=3>
<tr>
<td align=left><font size=-1>
<a href="$$home$$">ホーム</a> ←変数部で指定したホームページのURLが入ります。
<a href="$$msearch$$?index=$$index$$&config=$$config$$">ヘルプ</a></font> ←CGI、インデックス、設定ファイルの名前が入ります
</td>
<td align=right><font size=-1 color=#3366cc>
Powered by msearch</font>
</td>
</tr>
<tr>
<td colspan=2 align=center><font size=-1>
<b>HP内検索</b>&nbsp;&nbsp;
<input type=hidden name="index" value="$$index$$"> ←インデックスの名前が入ります
<input type=hidden name="config" value="$$config$$"> ←設定ファイルの名前が入ります
<input type=text size=30 name="query" value="$$query$$"> ←前の検索キーワードが入ります
<input type=submit value="検索"></font>
</td>
</tr>
</table>
<input type=hidden name="set" value="1">
<input type=hidden name="num" value="$$rpp$$"> ←ページあたりに表示する件数が入ります
</form>
<table border=0 cellspacing=0 width=98% style="margin-bottom:1ex">
<tr>
<td bgcolor=#3366cc align=left>
<font size=-1 color=white>&nbsp;$$total$$件ヒットしました. ←ヒットした件数が入ります
$$from$$件目から$$to$$件目を表示します.</font> ←何件目から何件目の結果を表示しているか数字が入ります
</font>
</td>
<td bgcolor=#3366cc align=right>
<font size=-1 color=white>検索にかかった時間$$cputime$$秒&nbsp;</font> ←検索にかかった時間が入ります
</td>
</tr>
</table>
# 検索セットへのアクセスは上と下に同じものを付けています
$$previous$$ ←[前へ]という直前ページへのリンクが入ります
$$pset$$ ←[1][2]など現在表示している結果ページより前のページへのリンクが入ります
$$cset$$ ←[3]など現在表示しているページ番号が入ります
$$nset$$ ←[4][5]など現在表示している結果ページより後のページへのリンクが入ります
$$next$$ ←[次へ]という直後ページへのリンクが入ります
</center>
<p>
<dl>
# ↓ここに検索結果のヒット項目が繰り返されて表示される
$$result$$ ←検索結果が入ります。次項のフォーマットに従って出力されます。
</dl>
<center>
# 検索セットへのアクセスは上と下に同じものを付けています
$$previous$$ このあたりは上と同じです。
$$pset$$
$$cset$$
$$nset$$
$$next$$
</center>
</body>
</html> ←書き換えはこの行まで
end ←これは変更してはいけません。スキンはここまでという合図。

 埋め込み変数は必ずすべて使わなくてはならないということはありません。formの中に埋め込む変数と、$$result$$、前後ページへのリンクがあれば最低限の用は足りてしまいます。


2-2. 検索結果画面の項目の設定とフォーマット

 検索結果画面の中に埋め込む変数のうち、いくつかの変数はここで変更することができます。「# ●ヒット項目の表示」を例にしてみます。

begin result 10 ←この行を削除してはいけません。「10」を20に変更すると、ページあたり20件表示するようになります。
<dt>$$resultnum$$. <a href="$$url$$">$$title$$</a> ←何番目の結果か、URL、タイトルが入ります
<dd><font size=-1 color=#999999>$$url$$</font><br> ←ファイル名表示がいらなければこの行を削除します
<font size=-1>$$summary$$</font> ←ヒットした部分が入ります
<p>
end ←この行を削除してはいけません

 ちょっと手を入れてみましょう。cgiと同じディレクトリに「image」ディレクトリがあり、その中に「mark1.gif」が入っているとします。赤字が変更個所です。太字はワンポイント解説です。

begin result 20 ←1ページあたり20行表示するようにしてみました
<dt>$$resultnum$$. <a href="$$url$$" target="_blank"><img src="image/mark1.gif" WIDTH="12" HEIGHT="12" ALIGN="BOTTOM" BORDER="0"></a><a href="$$url$$">$$title$$</a> ←別窓で開くようにアイコンを付けてみました
<dd><font size=-1 color=#999999>$$url$$</font><br>
<font size=-1>$$summary$$</font>
<p>
end ←この行を削除してはいけません

 このように、埋め込み変数のデザインも変更が可能です。


2-3. ヘルプ画面のフォーマット

 こちらはヘルプ画面(初期画面)のデザインです。「2-2. 検索結果画面のフォーマット」と同様、HTMLの中に埋め込み変数が入っています。


■ログの活用 ▲ページトップ

 ver1.3まではログの出力ができませんでしたが、1.4以降は設定の変更だけでログを出力できるようになりました。現在はフォーマットの変更だけでログ出力の内容も変更できますし、出力漢字コードの変更も可能になっています。大変嬉しいです(^_^)

 設定の変更は.cfgファイルの変数設定部部行います。

 ここでは「ログって何?」という方のために利用法を書きます。

 ログを見ると次のようなことがわかります。

 検索機能は、ユーザーが必要なページに簡単にたどり着つけることを目的に設置するものだと思います。ちゃんとたどり着けているのか、確認するのがログといえます。

 もし「ヒット件数0」という結果が多いようなら、目的のページにたどり着けていないということですから、何らかの対策を施すべきです。でないとせっかくの検索機能が宝の持ち腐れになります。ログを大いに活用しましょう。


■改造例 ▲ページトップ

 以下は、僕の施した改造のメモです。改造を施すときには、オウンリスクでお願いします。すぐに元に戻せるように、コピーしたものを改造するとよいでしょう。

●ヒット数が0件だったら特別なメッセージを出す。 

 外部HTMLファイル(ファイル名「0html.dat」、EUC/LFで作成)を用意し、0件だったらこのファイルを読み込んで表示させるようにしました。この改造を施すとこんな感じになります。googleなどで検索し直すリンクを生成することも簡単です。
 改造後の検索例:「絶対無理だって、そんな検索」。

msearch.cgiの改造箇所は2箇所です。

●オリジナル 1339行目付近(1.5) 

###
### resultフォーマットの出力
###
sub printresult {
    my ($i, $orgurl, $format);
    my ($resultnum, $url, $title, $summary);
    my $reghl = "";           # URLハイライト化の正規表現

    # URLハイライト用の正規表現作成
    $reghl = join("|",@g_url) if(@g_url);

●変更後 赤い部分を追加。

###
### resultフォーマットの出力
###
sub printresult {
    my ($i, $orgurl, $format);
    my ($resultnum, $url, $title, $summary);
    my $reghl = "";           # URLハイライト化の正規表現
#水沢追加ここから
if ($v_total == 0){ # ヒットが0なら
    &noresult; # ファイルを読み込んで
    # エンコードを変換して
    if($f_encoding eq "shift_jis") {
        &jcode::convert(\$html,"sjis");
    } elsif($f_encoding eq "iso-2022-jp") {
        &jcode::convert(\$html,"jis");
    }
    # 埋め込み変数の置き換え。ただし一部だけ。
    $html =~ s/\$\$msearch\$\$/$v_msearch/g; # msearch
    $html =~ s/\$\$home\$\$/$v_home/g; # home
    $html=~ s/\$\$query\$\$/$v_query/g; # query(キーワード)
    $html =~ s/\$\$index\$\$/$v_index/g; # index
    $html =~ s/\$\$config\$\$/$v_config/g; # config
    print "$html" ; # 出力する
}
#水沢追加ここまで

    # URLハイライト用の正規表現作成
    $reghl = join("|",@g_url) if(@g_url);

●一番最後に追加したルーチン msearch.cgiの一番最後に追加します。

# 水沢追加ルーチン 検索結果が0だったときのHTMLファイル読み込み
sub noresult {
    $html_file = "0html.dat"; # 表示させるファイル名。
    # ファイルのオープン
    open (DAT,"<$html_file")|| die "HTML出力用ファイル$html_fileが開けません";
    #ファイルの読み込み
    $html = ""; # 初期化
    while ($_ = <DAT>){
        $html .= $_; # 最後まで読む
    }
    #ファイルのクローズ
    close (DAT) ;
}
# 水沢追加ルーチンここまで。

●0件用出力ファイルの例

 こちらにサンプルの「0html.dat」をおきます。このファイルの中で使える埋め込み変数は次の通りです。

$$query$$ $$home$$ $$msearch$$ $$index$$ $$config$$

 ▲ページトップ


homeホームHTMLに役立つヒント> msearch導入記