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

msearch導入記

これはKatsushi Matsudaさんの開発した全文検索システム、msearch質問・要望掲示板も稼働中)導入記です。

作者のKatsushi Matsudaさんに感謝いたします。この文章はバージョン1.3xを対象にしています(2001/8/27 従来の1.2x対象の文章を元に書き改めました。現在、1.21も平行して公開されていますので、一部重複していますが1.2xを対象とした僕の解説ページもこちらで見られるようにしてあります)。
2001/10/1 msearchはver.1.33バージョンにアップ! 現在イチオシの検索エンジン!

こちらでテスト中です(テストを希望される方はこちらのcgiでお願いします。こちらはログ出力されません)。
検索テスト」も参照してください。

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

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


■■ 目次 ■■


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

 msearchはスクリプト言語(perl)で書かれた、インデックスを作成するタイプの検索エンジンです。
 一般にgrepタイプよりもインデックス作成タイプの方が高速に検索できる、検索時のサーバの負担が軽いとされています。grepタイプはインデックス作成の手間がかからない点がお手軽でいいですが、検索スピードが遅く、サーバに負荷がかかります。

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

 なお、msearchはフリーソフトですが、営利目的の使用の場合は作者の許可が必要です。

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

 

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

●検索結果

  • ナンバリング機能が付いた。
  • or検索のサポート。
  • 要約表示に次の2点の変化がある。
    • 該当ファイルの先頭から一定文字数を切り出すのではなく、キーワード部を表示するようになった。
    • キーワードを太字で表示するようになった。
  • 検索スピードの高速化。

●インデックス

  • 検索結果のソートは、これまで検索時に指定できたが、1.3からはインデックス時に指定するように改められた。検索時には指定できない。

1.32では、上記の変更に加えて全角1文字のの検索を正しく行うようにフィックスされています。
1.33ではインデックス機能が強化され、インデックス時に対象ディレクトリの指定に正規表現を使えるようになり、「インデックスしない」キーワードを指定することもできるようになりました。


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

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


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


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


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

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

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


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

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

 インデックスを作ったときに入力した条件は、ブラウザのCookieに入っていますから(デフォルトでは60日間有効。変更可能)、同じ条件をもう一度入力するような不自由はありません(設定日数以上インデックスを作らないとまた入力しなくてはいけませんが)。
 ブラウザでgenindex.cgiにアクセスし、パスワードを入力して「インデックス作成」ボタンを押すだけです。ラクチンラクチン。14ファイルを更新するのに5〜10秒程度ですみました。


■検索した感想 ▲ページトップ

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

 それに、フツーのCGIを設置したことがある人なら、誰でも設置できるくらい設置が簡単です。ホントにお手軽。
 ただ、解説によるとファイル容量の制限があるサーバや、CGIにファイルを作らせないようなサーバでは運用は面倒になるようです。

 not検索もできるし、バージョン1.3からはor検索もサポートされました。実力は十分です。説明書きでは次のようになっています。このあたりの機能も充実してますねー。
 or検索のやり方が()で囲むという方法で、他のソフトとは違っていますので注意が必要です。検索式を書くようなユーザーはヘルプを見るでしょうから、このあたりは大丈夫でしょう。

ホームページ内全文検索エンジンmsearchの使い方
意味
あいう キーワード「あいう」を含むページを検索.
あいう かきく キーワード「あいう」と「かきく」を両方とも含むページを検索.
あいう -さしす キーワード「あいう」を含み,かつキーワード「さしす」を含まない ページを検索.
(あいう かきく) キーワード「あいう」か「かきく」のどちらか一方もしくは両方を含む ページを検索.ただし,ネストはできません.
あいう t:たちつ キーワード「あいう」を含み,かつキーワード「たちつ」がページの タイトルに含まれるページを検索.
あいう u:profile キーワード「あいう」を含み,かつそのページのURLに「profile」 が含まれるページを検索.

※1 キーワード間は半角スペース,全角スペース,全角カンマ,半角カンマ で区切って下さい.また,OR検索の"("や")"は全角でもOKですし,その間の 区切りも上の区切り文字のいずれでもOKです.
※2 半角英数文字と全角英数文字,英文字の大文字と小文字は区別せずに 検索します.
※3 タイトル検索(t:)とURL検索(u:)はそれぞれ大文字(T:)(U:)でもOKです.
※4 上の条件式をどのようにでも組み合せて検索式を作ることができます.
例えば,「A B,(C D),(E F,G) -H t:I,U:J」等の難しい検索式も可能 です.
この検索式の意味は, 「AとBを含み,かつCかDを含み,かつEかFかGを含み,かつHを含まず, かつタイトルにIを含み,かつURLにJを含む」となります.
※5 「-1」のようなマイナスから始まる文字を検索したい場合は, 「"-1"」のように半角のダブルクオーテーション(")で囲って下さい.さも ないと「1」を含まないというNOT検索になってしまいます.ただし,OR検索内 ではダブルクオーテーションは必要ありません(例:「(-1,-2)」で-1か-2を含む というOR検索になります).
※6 「(^o^)」や「(株)」のようなカッコで囲まれた文字を検索したい場合 は,そのまま入力して下さい.ただし,上の区切り文字がカッコ中に含まれる場合は, OR検索になります.

 出力順(最終更新時刻降順、最終更新時刻昇順、ページ内容降順、ページ内容昇順、タイトル降順、タイトル昇順、URL降順、URL昇順)については、1.21までは検索時に指定することが可能でしたが、1.3ではインデックス時に指定するため、検索時に指定することはできなくなりました。

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


■ver.1.3を使う時のコツ ▲ページトップ

 1.3の特徴を浮き彫りにするために、ver.1.21と対決させました。

検索対象ディレクトリ:コンパクトカメラデータ
検索対象ファイル数:690

検索単語
10件表示 20件表示

30件表示

50件表示

全件表示
1単語 性能表 ヒット数:690
CPU秒
1.21:0.859
1.3:0.102
ヒット数:690
CPU秒
1.21:0.883
1.3:0.133
ヒット数:690
CPU秒
1.21:0.867
1.3:0.133
ヒット数:690
CPU秒
1.21:0.867
1.3:0.148
ヒット数:690
CPU秒
1.21:0.922
1.3:0.922
28mm/ ヒット数:78
CPU秒
1.21:0.164
1.3:0.258
ヒット数:78
CPU秒
1.21:0.195
1.3:0.250
ヒット数:78
CPU秒
1.21:0.195
1.3:0.273
ヒット数:78
CPU秒
1.21:0.188
1.3:0.289
ヒット数:78
CPU秒
1.21:0.203
1.3:0.336
単焦点 ヒット数:303
CPU秒
1.21:0.438
1.3:0.078
ヒット数:303
CPU秒
1.21:0.430
1.3:0.102
ヒット数:303
CPU秒
1.21:0.438
1.3:0.125
ヒット数:303
CPU秒
1.21:0.414
1.3:0.180
ヒット数:303
CPU秒
1.21:0.414
1.3:0.516
2単語
AND検索
28mm/ 単焦点 ヒット数:33
CPU秒
1.21:0.117
1.3:0.250
ヒット数:33
CPU秒
1.21:0.148
1.3:0.250
ヒット数:33
CPU秒
1.21:0.133
1.3:0.289
ヒット数:33
CPU秒
1.21:0.102
1.3:0.281
ヒット数:33
CPU秒
1.21:0.125
1.3:0.297
3倍ズーム 現行品 ヒット数:66
CPU秒
1.21:0.172
1.3:0.133
ヒット数:66
CPU秒
1.21:0.164
1.3:0.141
ヒット数:66
CPU秒
1.21:0.188
1.3:0.141
ヒット数:66
CPU秒
1.21:0.188
1.3:0.164
ヒット数:66
CPU秒
1.21:0.141
1.3:0.172
3単語
AND検索
28mm/ 単焦点 現行品 ヒット数:14
CPU秒
1.21:0.117
1.3:0.258
ヒット数:14
CPU秒
1.21:0.125
1.3:0.242

ヒット数:14
CPU秒
1.21:0.102
1.3:0.266

 なかなか微妙な結果です。

 1.21では全件表示でも件数制限をしても時間がほとんど変わりませんが、1.3では件数制限すると飛躍的に速くなります。ヒット数が多いと顕著にでる特徴です。1.3を使うなら、件数制限をして使うのがコツといえます。

 しかし、ヒット数が少ない場合は、1.3よりも1.21の方が高速です。んがしかし、ヒット数が少なくても1.3の方が高速なケースもあり、複合的な条件が背景にあることを示唆しているように見受けられます。全体的には1.2xの方が高速で、場合によっては1.3が高速と、複雑になってます(^^;

 この結果から、1.3でも十分実用範囲内のスピードであると思いますので、1.3の利点(or検索のサポート、英数字を半角で表示する、キーワード部分を表示し、ボールドなどで目立たせてくれるetc)がほしいなら1.3にすると良いでしょう。それらの特徴がいらないなら、1.2xのままでも良いでしょう。この場合、ヒット数が多いと時間がかかる点に注意が必要です(1.3でも全件表示では遅いが、件数を制限すると速い)。

 なお、「検索テスト/第4回」にpnamazuの検索結果と上の表の比較表を参考として載せました。検索条件が違うんで、直接の比較にはならないですが。


2001/7/7追記 これはver.1.21の時のもので、1.3ではありません。資料として残してあります。
 僕のサイト全体をインデックスしてみました。インデックスの作成時間は2分05秒。INDEXの大きさは2,741k。予想より時間がかかりました。

既存のインデックスを読み込みます.完了(0ファイル).
インデックス化するファイルを収集しています.完了(1316ファイル).
インデックスから削除(0ファイル)
インデックスの更新(0ファイル)
インデックスに追加(1316ファイル)
インデックスを保存しています.完了(1316ファイル).

検索単語
全件表示

10件表示
1単語 バカ話 ヒット数:50
CPU秒:0.234
ヒット数:50
CPU秒:0.234
ビール ヒット数:93
CPU秒:0.281
ヒット数:93
CPU秒:0.273
カメラ ヒット数:881
CPU秒:1.211
ヒット数:881
CPU秒:1.109
2単語
AND検索
そこで だから ヒット数:8
CPU秒:0.219
ヒット数:8
CPU秒:0.211
定価 転載 ヒット数:218
CPU秒:0.438
ヒット数:218
CPU秒:0.430
3単語
AND検索
あの その これ ヒット数:21
CPU秒:0.211
ヒット数:21
CPU秒:0.211

 上の表をみるとわかりますが、ページあたりの表示件数を変えても時間はほとんど変わりません。ただし、当然のことですが、全件表示にした場合は転送スピードの影響をモロに受けますから、表示までの体感スピードは遅くなります。


まとめ

 インデックスタイプはインデックスの作成時にサーバ負荷が高いものがあります。わたしが試したところでは、msearchはインデックスの作成がもっとも高速です。これまでで最も速いものでも1分ほどかかっていましたが、msearchはわずか20秒から30秒です(ファイル数600程度であることを忘れずに)。

 検索スピードも超高速です。ただし、これはまだファイル数が少ないためかもしれませんので、その点を頭に入れておいて下さい。

 現時点ではインデックススピード、検索スピードともperlタイプとしてはトップクラスです。
 加えて設置が簡単(FTPとブラウザでOK。telnetは必要ありません)です。

 中・小規模でインデックスタイプをお考えなら文句なくmsearchを押します。
 インデックスタイプはインデックス作成の手間がいやだという方はとほほさんのwwwsrchをお薦めします(ver3.09以上)。


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

 どの程度の規模まで実用になるのかテストしたいと思い、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ですでに限界が来ているだろうということになります。

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


■ver.1.2xからのバージョンアップ ▲ページトップ

 FAQにもありますが、ver.1.2xからバージョンアップするときには注意が必要です。というのも、インデックスに互換性がありません。1.3xにアップした場合は、一度インデックスを削除して、もう一度作成しなおして下さい。


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

●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時頃がよいでしょう。


■Tips ▲ページトップ

●全件ヒットさせる。

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

●キーワードが文字化けする場合

 検索フォームをsjisで作成するとこうなります。最も簡単な解決方法は、検索フォームをEUCで書くことです。
 もう一つの解決策として、cgiを改造する方法もあります。詳しくは改造メモをご覧ください。次のバージョンでフィックスされるでしょう。


■トラブルシューティング(設置時) ▲ページトップ

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

 「CGI設置入門/トラブルシューティング」などを参照しながら基本的なチェックをしてください。msearchの解説ももう一度読んでみましょう。FAQも読み逃さないようにしてください。
 msearch掲示板を見ていると、案外FAQが読まれていないようです。

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

 msearchを設置する際のチェックツールを作りました。

1. check_ms.txtをクリック。
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掲示板で相談するという手があります。もともとバグ情報や次期バージョンでの要望などを作者に伝えるための掲示板ですが、設置方法についても相談に乗ってくれます。
 作者にサポートしてもらえるというのは心強いものです。

 ただ、この手の掲示板の礼儀だけは守りましょう。

 どんなことをして、どんな症状があって、どんな不具合がでているのか、できるだけ正確に書きましょう。
 アドバイスがあったら、アドバイスの何を実行して何を実行しなかったか、実行の結果はどうだったか、キチンと報告してください。これを怠ると、同様の症状にみまわれた他の人の参考になりません。自分だけが解決すればいいという態度は捨てて、他の人にも役に立つように掲示板に書き込むように心がけましょう。

●場合別解決法

 よくあるケースの解決法を書きます。

○indexが作れない
 1回、空っぽのindex.datファイルを作って(genindex.cgiと同じディレクトリに入れて、パーミッションを666にします)からもう一度インデックスしてください。

○検索結果のキーワード欄の文字が化けている
 検索フォームをSJISで記述していると思います。EUCでフォームを書くと文字化けしません。

○フレームを使っているので別フレームに結果を表示させたい
 フォームをちょっと変更するだけです。「<form action="http://......." .... target="main">」とするだけです。「main」は表示させたいフレームを指定してください。


■改造メモ ▲ページトップ

●以下、僕の改造例を示します。赤字で示した部分が追加・書き換えなどの部分です。つーかですね、以下はぼくの改造記録で、備忘録のようなものです。改造を施す場合は、オウンリスクでお願いします。
 また、この改造について、作者のKatsushi Matsudaさんに問い合わせするなど、ご迷惑のかかることはくれぐれもしないようにお願いします。
 以下に示している「何行目」というのは目安と思ってください。改造のために行数がずれてますので<(_ _)>

 改造例を見たい場合は、このページのトップにあるテストページを見てください。

  1. 出力結果の表示件数をユーザーが変更できるようにしたい。※改造済み。下記参照
     このヒントはFAQに書かれていました。呼び出すHTMLに次のように埋め込んでやると、「一度に表示する検索結果を10件」となります。
    <input type=hidden name="num" value="10"> ←ページあたりの表示件数。0にすると全件
     改造例では、「簡単検索」の機能も付け加えています。
     
  2. CPU消費時間の表示。※改造済み。下記参照
     この機能は別に他の人は必要ないでしょう。僕の場合、他のサーチエンジンと比較したいのでつけたいわけです。お使いのサーバで負荷をチェックしたい場合には付けるといいでしょう。
     
  3. ログを出力させる。※改造済み。下記参照
     ログって役に立つんですよ。ほかの検索cgiですが、これまでにもログを観察していて、次のような点を発見しました。
    ・全角英数字で検索する人がいる。→全角を半角に変換して検索するようにした。
    ・ほとんどの人がキーワードを一つしか入れないので絞り込みができずにいる。→簡単検索の導入。
    ・よく検索されるキーワードがデータに抜けていることを発見。→データに追加した。
     こんな風に、ログをみるといろんな発見があるんですね。管理者としてはぜひほしい機能です。
     
  4. インデックス更新日を表示。※改造済み。下記参照
     「インデックス、更新したっけ?」なーんてことを防ぐためです。
     
  5. ホームページに戻るリンク。下記参照
     僕には必要ないですが(フレームなんで)、要望があるようなので3パターン作ってみました。
     
  6. 検索窓の色や大きさを変える。下記参照
     ユーザーの皆さん、けっこう黄色、20幅のまま使っているみたいですね。
     
  7. 検索結果を別フレームに表示させたい。下記参照
     これもFAQなんですが一応。また、検索結果の検索窓の文字化け解消TIPsもこちら。
     
  8. 検索結果が文字化けする場合。下記参照
     実はmsearchのバグです。最も簡単な回避方法は、検索フォームをsjisではなくEUCで書くことです。もう一つはcgiを改造する方法です。ここでは改造方法を紹介します。
     なお、この問題は次のバージョンでフィックスされるでしょう。

■改造例 ▲ページトップ

 赤字が変更部分です。オリジナルと見比べて、正しい位置にコピー&ペーストしてください。
 なお、改造後はcheck_ms.cgi(トラブルシューティング参照)を使うと文法をチェックしてくれます。エラーがでたら改造位置を間違えている可能性大です。もう一度確認してやり直してみましょう。

※下の改造例からカット&ペーストする際、改行コードに注意してくださいペーストしたところだけ改行コードが他と異なってしまい、動作しないという例が報告されています。この場合、改行コードをすべてLFに統一することで動作するようになります。改造がうまくいかなかったらチェックしてみてください。

●CPU消費時間を追加。 ▲改造メモへ

 次の2箇所を改造し、サブルーチンを一つ追加します。

●オリジナル 一番最初

#!/usr/local/bin/perl

●改造後

#!/usr/local/bin/perl
### 計算時間測定開始・水沢
### スクリプトの頭の方に書く・水沢
$CPU_start = (times)[0] ;#・水沢

●オリジナル 434行目付近(1.31では670行目付近)

###
### HTMLフッターーの出力
###
sub printfooter {
    print "</body>\n";
    print "</html>\n";
}
			

●改造後

###
### HTMLフッターーの出力
###
sub printfooter {
    &printcputime ; # 水沢追加
    print "</body>\n";
    print "</html>\n";
}			

●サブルーチンを追加 場所はどこでもいいですが、一番最後が無難。

### 消費CPUの表示
sub printcputime {
### 計算時間測定終了
### スクリプトのHTML出力部分に書く
$CPU_end = (times)[0];
printf("<DIV align=right>消費時間: %.3f CPU秒</DIV>\n",
$CPU_end-$CPU_start);
}

●検索オプション(表示件数)と簡単検索を表示 〜ソート順変更機能はver.1.3以降は利きません。インデックス時に指定されるように仕様変更されました。 ▲改造メモへ

 次のように改造します。

 簡単検索を付けると、オリジナルのままだと、検索窓には「,オリンパス,,,,,」などのように「,」というゴミが入ります。これを取り除くために次の行を追加します。

 次のように1行追加します。

●オリジナル 552行目付近(1.3。1.32では671行目付近)

### 入力フォームの出力
###
sub printform {
    my $cgi = $_[0];		# CGI(入力)
    my $query = $_[1];		# 検索式(入力)
    my $set = $_[2];		# 検索セット(入力)
    my $num = $_[3];		# 表示数(入力)

    print <<HERE_DOC;
						

●改造後

### 入力フォームの出力
###
sub printform {
    my $cgi = $_[0];		# CGI(入力)
    my $query = $_[1];		# 検索式(入力)
    my $set = $_[2];		# 検索セット(入力)
    my $num = $_[3];		# 表示数(入力)

$query =~ s/,//g ; # 簡単検索の,を取る。水沢追加

    print <<HERE_DOC;
						

 出力部に手を入れます。

●オリジナル 577行目付近(1.3。1.32では708行目付近)

</table>
<input type=hidden name="set" value="$set">
<input type=hidden name="num" value="$num">
</form>
</center>
HERE_DOC
}
			

●改造後 

</table>
<input type=hidden name="set" value="$set">

HERE_DOC

# ↑ここまででカット
# メモ↓ver.1.21以前
# <input type=hidden name="num" value="$num">
# <input type=hidden name="sort" value="$sort">
# <input type=hidden name="smethod" value="$method">
# </form>
# </center>
# HERE_DOC		
$num2 = $num ; # 変数引継	
# $method2 = $method ; # メモ:ソート用変数引継
&easy_s ; # 簡単検索出力。水沢追加	
print "</form>\n</center>"; # 水沢追加
}		

 検索オプション・簡単検索の出力ルーチンを追加します。ファイルの一番後ろに入れましょう。

●以下のルーチンを追加します。<select></select>はいくつでも追加できます。その際、「name="query"」とするのがポイントです。

### 簡単検索出力
sub easy_s {
###変数の引継
if ($num2 == 0){
	$num_w = "全";
} else {
	$num_w = $num2;
}

#	ソート選択機能はなくなった
# 	if ($method2 eq ""){ # 空だったらタイトル降順に
# 		$method2 = "TITLE-DESC";
# 		$smethod_w = "タイトル降順";
# 	} else {
# 		if ($method2 eq "TITLE-DESC"){$smethod_w = "タイトル降順";}
# 		if ($method2 eq "TITLE-ASC"){$smethod_w = "タイトル昇順";}
# 		if ($method2 eq "CONTENTS-DESC"){$smethod_w = "ページ内容降順";}
# 		if ($method2 eq "CONTENTS-ASC"){$smethod_w = "ページ内容昇順";}
# 		if ($method2 eq "URL-DESC"){$smethod_w = "URL降順";}
# 		if ($method2 eq "URL-ASC"){$smethod_w = "URL昇順";}
# 		if ($method2 eq "MODIFY-DESC"){$smethod_w = "最終更新時刻降順";}
# 		if ($method2 eq "MODIFY-ASC"){$smethod_w = "最終更新時刻昇順";}
# 	}

### 以下表示
print <<"_EASY_";
<!--■表示件数とソート順■-->
	<br>
	<!--■検索オプション■-->
	<select name="num">
	<option value="$num2" selected>表示件数:$num_w件
	<option value="10">10件
	<option value="20">20件
	<option value="30">30件
	<option value="50">50件
	</select>
		<!--■↓ソートはなくなった
		<input type="hidden" name="sort" value="1">
		<select name="smethod">
		<option value="$method2" selected>ソート順:$smethod_w
		<option value="TITLE-DESC">タイトル降順
		<option value="TITLE-ASC">タイトル昇順
		<option value="CONTENTS-DESC">ページ内容降順
		<option value="CONTENTS-ASC">ページ内容昇順
		<option value="URL-DESC">URL降順
		<option value="URL-ASC">URL昇順
		<option value="MODIFY-DESC">最終更新時刻降順
		<option value="MODIFY-ASC">最終更新時刻昇順
		</select>
		■-->
<!--■簡単検索■-->
<p>
<hr width="50%">
</p>
<p>
  ↓指定した内容が↑キーワードに追加されます。
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="100%">
<select name="query"> ← name="query"とするのがポイント。好きなように選択肢を作って下さい。
<option value="">メーカー名↓
<option value=" /olympus">オリンパス
<option value=" /canon">キヤノン
<option value=" /kyocera">京セラ
  …
  …
</select>
</td>
</tr>
</table>
</p>
<hr>
_EASY_
}

●ログ出力を追加 ▲改造メモへ

 次の1箇所を改造し、サブルーチンを一つ追加します。一応追加モードで開いた上にflockでロックしていますが、タイミングによってはファイルが壊れることがあるかも。
 なお、flock関数が使えないサーバの場合はflock行を削除すること。

2001/7/7:早速バグが発覚し、下の改造を一部手直し。

●オリジナル 856行目付近(1.3。1.32では1070行目付近)

### 検索件数と表示数の出力
###
sub printnum {
    my $total = $_[0];		# トータルヒット数(入力)
    my $start = $_[1];		# 表示開始件数(入力)
    my $end = $_[2];		# 表示終了件数(入力)

    print "<small>$total件ヒットしました.";
						

●改造後

### 検索件数と表示数の出力
###
sub printnum {
    my $total = $_[0];		# トータルヒット数(入力)
    my $start = $_[1];		# 表示開始件数(入力)
    my $end = $_[2];		# 表示終了件数(入力)

&put_log ($total) ; # ログに出力・水沢追加

    print "<small>$total件ヒットしました.";
						

●サブルーチンを追加 場所はどこでもいいですが、一番最後が無難。
 ログファイル「msearch.log」は自動生成されます。ブラウザでアクセスすれば内容を見られます。大きくなったら削除してください。

###### ログに出力する・水沢
# 検索日時、キーワード、ヒット数をタブ区切りで出力。
# ホスト名を出力したい場合は下記参照。
sub put_log {
	my $total = $_[0] ; # トータルヒット数(入力)	
	$logfielname = "msearch.log" ; # ログファイル名。
	($sec, $min, $hour, $mday, $mon, $year) = localtime(time);
	$tmp = $g_query;
	&jcode'convert(*tmp, euc);	
	$tmp =~ s/,//g ; # 簡単検索の,を取る。
	open(OUT, ">> $logfielname");
	flock(OUT, 2); # 念のためロック。close時に自動的に解除される
	printf(OUT "%04d-%02d-%02d %02d:%02d:%02d %s %s",
		$year + 1900, $mon + 1, $mday, $hour, $min, $sec,); # 検索日時を出力
#		printf(OUT "\t$ENV{'REMOTE_ADDR'}"); # ホストを出力したければ行頭の#を削除
		printf(OUT "\t$total"); # ヒット数を出力
		printf(OUT "\t$tmp\n"); # 検索ワードを出力	
	close(OUT);
}

●インデックス更新日時を出力。 ▲改造メモへ

 いつインデックスを更新したのかわかるように。

 ↓オリジナルとなってますが、すでに改造されてます。上の検索オプションの追加で改造した部分です。

●オリジナル 577行目付近(1.3。1.32では710行目付近)

$num2 = $num ; # 変数引継	
# $method2 = $method ; # メモ:ソート用変数引継
&easy_s ; # 簡単検索出力。水沢追加	
print "</form>\n</center>"; # 水沢追加
}
						

●改造後

$num2 = $num ; # 変数引継	
# $method2 = $method ; # メモ:ソート用変数引継
&easy_s ; # 簡単検索出力。水沢追加	
&printmodtime ; # インデックス更新日出力。水沢追加
print "</form>\n</center>"; # 水沢追加
}
						

●サブルーチンを追加 場所はどこでもいいですが、一番最後が無難。

#### インデックスの更新日を表示
sub printmodtime {
	# 更新日時の取得
	$modtime = (stat($g_index))[9] ; # $g_indexはインデックスファイル名
	($sec, $min, $hour, $mday, $mon, $year) = localtime($modtime); #localtimeで現地時間に変換
	$year = $year + 1900;
	$mon= $mon + 1;
	print "<br>[インデックス更新日:$year 年$mon月$mday日$hour時$min分$sec秒]<br>";
}

●ホームページへのリンク ▲改造メモへ

 ↓画面の左上にリンクがでます。

========= 検索窓の前に付ける場合 =================

●オリジナル 527行目付近(1.3。1.32では650行目付近)

    $body_attr .= " vlink=\"$vlink\"" if $vlink;
    print "<body $body_attr>\n";
}
###
### HTMLフッターーの出力

●変更後 (↓3行目を追加します。)

    $body_attr .= " vlink=\"$vlink\"" if $vlink;
    print "<body $body_attr>\n";
    print "<p align=left><A HREF=\"http://xxxx.com/~name/index.html\">ホームページへ</A></p>\n";
}
###
### HTMLフッターーの出力

 ↓こちらは検索窓のすぐ下・中央にリンクができます。

========= 検索窓の下に付ける場合 =================

●オリジナル 565行目付近(1.3。1.32では710行目付近)

</form>
</center>
HERE_DOC
}
###
### 検索式の書き方の出力

●変更後 (↓2行目を追加します。)

</form>
<A HREF="http://xxxx.com/~name/index.html">ホームページへ</A>
</center>
HERE_DOC
}
###
### 検索式の書き方の出力

 ↓こちはフッタ部分・右にリンクができます。

========= 検索窓の下に付ける場合 =================

●オリジナル 664行目付近(1.32)

### HTMLフッターーの出力
###
sub printfooter {
    print "</body>\n";
    print "</html>\n";
}

●変更後 (↓追加します。)

### HTMLフッターーの出力
###
sub printfooter {
    print "<hr><p align=right><A HREF=\"http://xxxx.com/~name/index.html\">ホームページへ</A></p>\n";
    print "</body>\n";
    print "</html>\n";
}

●検索窓の色や幅を変更する ▲改造メモへ

 色や幅を変えると雰囲気変わります。

●オリジナル 685行目付近(1.33。)

<tr>
<td valign=center align=center bgcolor=#F8FE00>
    <small>&nbsp<input type=text size=20 name="query" value="$query"></small>
<td valign=center align=left bgcolor=#F8FE00>
    <small><input type=submit value="検索"></small>
</table>
						

 オリジナルの赤い部分を変えると色が変わり、青い部分の「20」を変えるとキーワード入力窓の幅が変わります。

●検索結果を別フレームに表示させる ▲改造メモへ

 検索formにターゲットを書き加えればいいだけです。これはフレームですからhtmlを例にしています。

●htmlに書くform

<form action="/cgi-bin/msearch.cgi" accept-charset="x-euc-jp" target="main">
	<table border="0" cellspacing="0" cellpadding="3">
		<tr>
			<td align="left" bgcolor="#F8FE00"><small><font color="black"><b>HP内検索エンジン</b></font></small>
			<td align="right" bgcolor="#F8FE00"><small><a href="/cgi-bin/msearch.cgi">help</a></small>
		<tr>
			<td valign="center" align="center" bgcolor="#F8FE00"><small>
					<input type="text" size="20" name="query" value=""></small>
			<td valign="center" align="left" bgcolor="#F8FE00"><small>
					<input type="submit" value="検索"></small>
	</table>
</form>
             

 赤い部分がポイント。単純に表示するフレームを指定すればよいだけです。
 このformを書くhtml自体をeucで記述すると、検索結果のキーワードの文字化けも防げます。

●文字化けを解消する ▲改造メモへ

 最も簡単なのは検索フォームをECUで書くことです。
 ここではフォームがEUCでもSJISでも大丈夫なようにCGIを改造する方法を紹介します。

改造箇所は2箇所です。

●オリジナル 98行目付近(1.33) 赤い部分を追加。

    ## 検索式の保存
    $g_query = $query;

●変更後 (↓2行目を追加します。)

## 検索式の保存
&jcode::convert($query,"euc");
$g_query = $query;

 もう一つは下記のように削除します。

●オリジナル 816行目付近(1.33) 青い部分を削除。

sub normalize {
    my $string = $_[0];		# クエリーへの参照(入力)
    &jcode::convert($string, "euc", "", "z"); # 漢字コードをEUCに
    &jcode::h2z_euc($string);	# 半角カナを全角に

●変更後 (↓2行目を追加します。)

sub normalize {
my $string = $_[0]; # クエリーへの参照(入力)


&jcode::h2z_euc($string); # 半角カナを全角に

 ▲ページトップ


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