ホームページ内全文検索エンジンmsearch

 msearchとは
Cross Site Scripting対応強化.
最新バージョン(1.46)を公開開始.是非バージョンアップを.

■ユーザサイト一覧  こんなに使われている! 使用されている方は,ご連絡下さい.
■msearch掲示板  msearchに関する質問やご要望をどうぞ.
■スキン配布サイト一覧  好きなスキンを選ぼう! スキンを配布されている方は,ご連絡下さい.

 ホームページ内全文検索エンジンmsearchとは,個人または比較的小規模の法人 ホームページ内の検索を提供するCGIプログラムです.
 以下のような機能があります.

  1. 検索用インデックスを作るので,作らないタイプの検索エンジンより高速.
  2. インデックス作成,検索ともにperlで動作.
  3. 提供するperlスクリプトのみで動作するので,カスタムCGIを設置できるWebサーバならどこでもインストール可能.
  4. and検索,or検索,not検索,タイトル検索,URL検索が可能.
  5. 3種類(降順,昇順を含め6種類)のランキング(結果表示のソート)が可能.
  6. キーワードがマッチした部分の強調表示が可能.
  7. 検索対象HTMLページの漢字コードはSJIS,JIS,EUC全てをサポート.
  8. 全角1文字の検索キーワードも正しく検索可能.しかも高速.
  9. 様々なインデックス化のオプションをインデックス作成CGIから指定可能.
  10. インデックスの更新は,自動的に差分を調べて作られるので高速.
  11. インデックスに登録したくないキーワードの指定が可能.
  12. 検索結果表示画面をHTMLで記述できるので,簡単にカスタマイズ可能.
  13. 検索ログを出力可能.
  14. Cookieによるインデックス作成オプション記憶で更新が簡単.
  15. 無料.(^o^)
 実際に動作しているmsearchを使うには,作成者の ホームページでどうぞ.
 作成者への連絡はメールどうぞ.

 ダウンロード
 本ソフトウェア(msearch)をダウンロードされる場合は,以下の利用規定に同意 したとみなさせて頂きます.
  1. 本ソフトウェア(msearch)はフリーソフトウェアですが,著作権は作成者(Katsushi Matsuda)に属します.
  2. 本ソフトウェアを利用したことによる,いかなる結果,損害,トラブルについて作成者は一切の責任を免れます.
  3. 有料,無料を問わず,再配布する場合は作成者に連絡して下さい.
  4. 作成者に許可なく,営利目的での利用(有償でのレンタルや販売,設置代行等)はできません.
  5. 本ソフトウェアの改造は非営利目的の範囲内で自由にできますが,ソフトウェア内に記述された作成者の著作権表示部分を削除,修正することはできません.
  6. バグ報告を除き,改造依頼や改造方法については基本的にお答えできません.
  7. 設定ファイル(config.dat)は,作成者に許可なく配布することができます.
msearch 1.46のダウンロード(LZH圧縮)
msearch 1.45のダウンロード(LZH圧縮)
msearch 1.44のダウンロード(LZH圧縮)

 現在の最新バージョンは1.46です.
【重要】 1.46では,Cross Site Scriptingの対応を強化しました.
【重要】 1.44では,インデックス(mindex.dat)の形式を若干変更しました. 1.43以前のインデックスは使えませんので,一度mindex.datを削除した上で, インデックスを作り直して下さい.
【重要】 1.43では,フォーマット変数$$url$$に若干の変更があります. スキンをカスタマイズされている方は設定ファイルの修正が必要です.
【重要】 1.4xではファイル構成や設定方法が大幅に変更になりました. インストール方法およびカスタマイズの方法を良くお読みになってインストール して下さい.
1.33の設定方法に関する説明はこちらをご覧下さい.
1.3x以上より高速ですが,or検索ができない,結果表示が全て大文字に なるという仕様の1.21はこちらで公開しています. 1.21の設定方法に関する説明はこちらをご覧下さい.

 更新履歴
更新日 内容
ver. 1.46
12/25/02
以下の修正
(1) Cross Site Scriptingの<script>タグ等のタグ以外の脆弱性に対応しました.
(2) 検索結果のサマリー表示の「...」を半角にしました.
(3) 日時表示のフォーマット変数化($date_format).
(4) ログファイルの漢字コードが指定可能に($logencoding).
(5) HTML出力漢字コードが指定可能に($encoding).
(6) config.datとスクリプト中のHTMLの</tr>と</td>タグを入れました.
(7) PHP等のタグ除去.
(8) <title lang=**>に対応.
(9) genindex.plの出力漢字コードにJISを追加.
ver. 1.45
4/10/02
以下の修正
(1) '$'と'?'を含む検索式で正常に検索できなかったバグを修正しました.
ver. 1.44
4/1/02
以下の修正
(1) インデックスの形式を変えました.これは英語等の日本語以外のページの検索 にも対応するためです.
(2) 悪意ある検索式を排除するようにしました.
(3) インデックス作成時の出力メッセージを整理しました.
(4) インデックス作成時のデバッグ情報出力をフォームから指定できるように しました.
ver. 1.43
3/4/02
以下の修正
(1) URL検索で"foo/bar"のように"/"等のメタキャラクタが含まれる場合に正しく 検索できなかったが,それを修正.
(2) フォーマット変数$$url$$がURL検索の際,正しいURLではなく,HTMLのタグが 含まれてしまう仕様上のバグを修正
フォーマット変数についてはFAQをご覧下さい.
ver. 1.42
1/31/02
Cross-Site Scriptingに対応(その2)
1.41では<script>しか対応していなかったのを他の危険なタグにも対応.
ver. 1.41
1/31/02
Cross-Site Scriptingに対応
1.40以下のmsearchではCross-Site Scriptingに対するバルナビリティがあり ました.1.41ではこの問題を解決しています.
1.41へのバージョンアップは,1.40のmsearch.cgiを1.41のものに入れ替える だけでOKです.
ver. 1.40
1/24/02
1.40を正式公開開始
1.40は以下の特徴があります.
(1) 全角1文字検索の速度向上.他の検索とほぼ同じ速度(10倍以上)を実現.
(2) 半角英文字検索の速度向上.2割程度向上.
(3) 検索結果画面のフォーマット(HTMLによるスキン作成)化.
(4) 検索ログ出力に対応.
ver. 1.40β3
1/21/02
以下の修正
(1) helpフォーマットでもindexnum変数が参照できるように修正.
(2) ログを出力できるように修正.
(3) キーワードに半角英文字がある場合の検索速度向上.
ver. 1.40β2
1/20/02
以下の修正
(1) 全件表示ができないバグの修正.
(2) 検索結果が0件のときにcsetとnsetを表示してしまうバグの修正.
(3) CGI引数でquery引数に値がない場合にも対応.
ver. 1.40β1
1/18/02
1.40のベータテスト開始
ver. 1.33
10/10/01
1.33を正式公開開始
ver. 1.33β
09/29/01
以下のバグを修正
(1) 半角カタカナのキーワードで検索できない.
以下の機能の追加
(1) インデックス時の非対象ディレクトリと非対象ファイルの指定に正規表現が 使えるように.
(2) インデックスに登録したくないキーワードを指定できるように.
これらの追加機能については,インストール方法をご覧 下さい.
ver. 1.32
09/12/01
1.31の検索結果のリンクが変になるバグを修正
ver. 1.31
09/11/01
全角1文字の検索を正しくできるように修正 (FAQで詳しく説明)
ver. 1.3
08/25/01
1.3を正式公開開始
ver. 1.3β3
08/18/01
以下の修正
(1) マイナスから始まるキーワードに対応.
(2) カッコで囲まれたキーワードに対応.
(3) URL検索で強調表示されないバグを修正.
(4) 少しだけ高速化.
ver. 1.3β2
08/17/01
以下の仕様変更
(1) 検索結果を表(table)から定義(dt)に.
(2) マッチした部分の強調表示が変更可能に.
ver. 1.3β
08/16/01
以下の新規機能を追加
(1) OR検索が可能に.
(2) 検索結果の各項目をナンバリング.
以下の仕様の修正
(1) 検索結果の一部表示が先頭ではなく,マッチした部分に.
(2) マッチした部分のボールド表示.
(3) 英数文字が全角の大文字で表示されていたのを元ページに忠実に.
以下の様に機能を縮小
(1) ソートの種類からページ内容の昇順・降順を削除.
(2) 検索時のソートの指定を削除し,インデクシング時に指定する.
大幅な機能増強ですが,ほとんど速度は落ちないように苦慮しました.
ver. 1.21
07/28/01
以下のバグの修正
(1) 対象ファイルを「.html」とした時,「.shtml」も含まれてしまう.
(2) タイトルに含まれる英数文字が検索漏れしてしまう.
(3) タイトルのみに含まれる文字が「:t」なしで検索できない.
(4) クエリーが全角の場合に検索漏れが発生する.
(5) 検索結果を全件表示にした場合にHTMLフッタを出力しない.
(6) 検索結果の件数が表示件数の倍数の時,ありもしない次の検索結果へのリンク が作られる.
Special thanks 水沢さん
ver. 1.2
02/19/01
ローカルでインデックス作成可能に.
ver. 1.1b
02/18/01
インデックス作成CGIがデバッグ情報出力可能に.
ver. 1.1a
01/09/01
インデックス差分更新のアルゴリズムを変更.
ver. 1.1
12/26/00
インデックス作成CGIをCookieに対応.
ver. 1.0
12/22/00
公開開始.
ver. 1.0β
12/21/00
作成者のホームページで運用開始.

 動作環境
 msearchは以下の環境での動作します.

プラットフォーム LINUXを含むUNIX系OS
Perlバージョン Perl 5.004以降,jperlは不可

 インストール方法
 インストールの方法について説明します. なお,ここでは,HTMLやCGI,perlについてある程度わかっている人を前提にして います.
また,水沢・penguin-19・和彦さんの msearch導入記は,インストール方法,評価,改造方法,インストール時の チェックツールの配布等,役に立つ情報が満載です.お勧めです.

  1. まずあなたのホームページにCGIが設置できるか調べて下さい.

    あなたのホームページが無料ホームページならば,そのサービスガイドを見て 下さい. またあなたのホームページがプロバイダやレンタルサーバ,ホスティングサービス ならば,それぞれのサービスガイドを見るか,管理者に尋ねてCGIが利用できるか 調べて下さい.

  2. msearchをダウンロードして下さい.

    必ず上の利用規定を読んで からダウンロードして下さい. LZH形式です. 解凍すると,以下の7つのファイルが作成されます.
    genindex.cgi インデックス作成CGI
    genindex.pl ローカルインデックス作成プログラム
    indexing.pl インデックス作成ライブラリ
    msearch.cgi 検索CGI
    config.dat 設定ファイルの例
    jcode.pl 歌代さん作の漢字コード変換ライブラリ
    fold.pl 歌代さん作の日本語文字列折り返しライブラリ

  3. 各種設定を変更して下さい.

     jcode.plとfold.pl以外のファイルの漢字コードはEUCですので,EUCで 読み込めて,EUCで書き込めるテキストエディタを用意して下さい.
     あなたのサーバのperlのパスを調べ,genindex.cgiとmsearch.cgiのそれぞれ先頭 行を書き換えて保存して下さい. 配布時には,perlのパスは/usr/local/bin/perlに なっています. もし,あなたのサーバのperlのパスが同じならば,書き換える必要はありません.
     次にgenindex.cgiの変数$g_passwordの値を書き換えて 下さい. 配布時には,パスワードは"msearchpass"となっていますので,これを好きなパスワ ードに必ず変更して下さい. 日本語でも構いません.
     基本的に,上の2つの設定さえすれば他に修正する必要はありません. その他検索結果画面をカスタマイズしたい場合は,下の カスタマイズの方法を参照して下さい.

  4. サーバにアップロードして下さい.

     6つのファイル(config.dat, genindex.cgi,msearch.cgi,indexing.pl, jcode.pl,fold.pl)をFTP等でサーバにアップロードして下さい. アップロードする先は,CGIが動作するディレクトリです. 各サーバ毎に違いますので各自調べて下さい. 例えば,freewebでは,各自のホーム ディレクトリ内にcgi-binというディレクトリを作ってそこにCGIをインストール します.
     アップロードする際のモードはテキスト,漢字コード は変換しない,改行はサーバに 合わせる,パーミッションはgenindex.cgiとmsearch.cgiが 755で,indexing.plとjcode.plとfold.plが 644で,config.datが644です. もし,jcode.plやfold.plがすでにサーバにあり,perlのパスが通っているなら, jcode.plやfold.plはアップロードする必要はありません. ただし,genindex.cgiとmsearch.cgiのrequireを修正する必要があります. 分からない人はjcode.plとfold.plをアップロードして下さい.

  5. 動作チェックして下さい.

     ブラウザを使い,CGIが動作するかチェックして下さい. 各サーバによって違いますが,ここではfreewebを例に取り説明します. 各自のホームディレクトリのcgi-binというディレクトリ直下に6つのファイルを アップロードしたとします. すると,msearchの検索CGIを呼び出すURLは,
    http://www??.freeweb.ne.jp/???/???/cgi-bin/msearch.cgi
    となります."?"の部分はユーザ毎に違います. 同様に,msearch用インデックス作成CGIを呼び出すURLは,
    http://www??.freeweb.ne.jp/???/???/cgi-bin/genindex.cgi
    となります.
     ブラウザに上のURLを入れてみて,エラーが出なければOKです.

  6. インデックスを作成して下さい.

     上のmsearch用インデックス作成CGIをブラウザで開いて下さい. 下のようなインデックス作成フォームが表示されます(各入力欄は空白です).

    それぞれについて説明します.

     対象ディレクトリとは,インデックスに登録するHTMLファイルがある トップディレクトリです. 絶対パスまたはgenindex.cgiがあるディレクトリ(アップロードしたディレクトリ) からの相対パスで指定します. 必ず1つだけ(複数指定したい場合についてはFAQを参照のこと) 指定します. この例では,genindex.cgiがあるcgi-binディレクトリの親ディレクトリを指定して います. インデックス作成CGIは,この対象ディレクトリより下にある全てのディレクトリ に含まれるファイルをインデックス対象とします.

     対象ディレクトリのURLには,上の対象ディレクトリが実際にはどのよう なURLで表されるかを指定します. この例では,サーバ内の"../"ディレクトリが"http://www.foo.co.jp/~bar/"という URLに相当するとしています. そしてサーバ内の"../index.html"ファイルは"http://www.foo.co.jp/~bar/index.html" というURLになります.

     対象ファイルの拡張子には,インデックス対象となるファイルの拡張子を 指定します. デフォルトは".html"と".htm"です. この場合はこの欄は空白でOKです. 例では,上のデフォルト拡張子に".shtml"を加えています. デフォルト以外の拡張子を指定する場合は,インデックス対象としたいファイルの 拡張子を全て指定しなければなりません. 複数の拡張子を指定する場合は半角のカンマ","で繋げて下さい.

     非対象ディレクトリには,対象ディレクトリより下にあるインデックス化 したくないディレクトリを指定します. このディレクトリ以下はインデックス対象となりません. 対象ディレクトリからの相対パスで指定します. この例では,サーバ内の"../cgi-bin/"というディレクトリ以下と"../secret/"という ディレクトリ以下をインデックス化したくないため,その相対パスである"cgi-bin/" と"secret"を指定しています.
    また,非対象ディレクトリの指定では,正規表現を使って指定することが可能です. ただし,この場合は,相対パスではなく,ディレクトリ名 のみでの正規表現のマッチが行われます. 例えば,"(_vti_cnf)"と指定すると,対象ディレクトリ以下にあるディレクトリの うち,"_vti_cnf"という名前のディレクトリが全て非対象 ディレクトリとなります. この正規表現による非対象ディレクトリの指定のためには,正規表現を"("と")"で 囲む必要があります. もちろん,正規表現ですから,上の"(_vti_cnf)"は"(^_.*f)"のように記述しても 構いません. ただしこの場合は,"_conf"というディレクトリも非対象ディレクトリとなります. 正規表現によるものと相対パスによるものは同時に指定可能です.

     非対象ファイルには,対象ディレクトリより下にあるインデックス化した くないファイルを指定します. 非対象ディレクトリ以下のファイルは指定する必要はありません. 対象ディレクトリ以下だけど,あるファイルのみインデックス化したくない場合, そのファイルを指定します. 非対象ディレクトリと同様に対象ディレクトリからの相対パスで指定します. 複数指定する場合は半角のカンマ","で繋げて下さい.
    非対象ディレクトリの指定と同様に非対象ファイルの指定にも正規表現が使えます. この場合も相対パスではなく,ファイル名単位での正規表現マッチとなります.

     非対象キーワードには,検索対象に入れたくないキーワードを指定します. ここで指定したキーワードで検索した場合,検索結果は0件となります. 半角カンマ(",")を使い,複数指定できます. 例えば,「検索」と「私」というキーワードを検索対象にしたくない場合は, "検索,私"と指定します. ここで 指定したキーワードは検索結果の一部表示にも出てきませんので注意して 下さい. ただし,タイトルに含まれるキーワードは削除しません.

     ランキング方法では,検索結果の表示に順序(ソート方法)を選択します. 選択できるランキング方法には,以下の7種類があります.

    1. なし :見つけた順
    2. 最終更新時刻-降順 :新しい順
    3. 最終更新時刻-昇順 :古い順
    4. タイトル-降順 :タイトル文字のアルファベット逆順
    5. タイトル-昇順 :タイトル文字のアルファベット順
    6. URL-降順 :URL文字のアルファベット逆順
    7. URL-昇順 :URL文字のアルファベット順
    好きなランキング方法を選んで下さい. インデックスを更新する際にも変更可能です.

     パスワードには,3の各種設定で設定したパスワードを入力して下さい. このCGIはインターネットでつながっているどこからでも動かすことができるので, パスワードがばれると悪意ある人がインデックスを壊したり,改変したり,また サーバに対して高負荷をかけたりする恐れがあります.

     デバッグ情報出力をチェックすることで,インデックス作成時に詳しい 情報を出力します. インデックスが作成できない場合は,ここをチェックして実行した結果を見ること で原因究明が行える場合があります. インデックス作成が正常にできる場合は,ここをチェックする必要はありません. また,インデックスに登録するページが多い場合,Webサーバによって強制的に CGIの実行が中断される場合があります. ここをチェックすることで,これを防ぐことが可能です.

     入力が終われば,インデックス作成ボタンを押します. すると,下のような表示がされるはずです.

    途中で止まったり,「インデックスを保存しています.完了(?ファイル)」という 表示がされなかった場合は,FAQを参照のこと.
     ver1.2から,ローカルPCでインデックスを作るPerlプログラムを添付しました. ActivePerl等のPerl環境がインストールされているPCのDOS Promptで,genindex.pl を実行します(genindex.plの他にindexing.plも同じディレクトリにある必要があり ます). すると,genindex.cgiのインデックス作成フォームと同じ入力項目を順に質問して くるので,genindex.cgiと同じオプションを入力して下さい(コマンドラインでの 入力になりますので,genindex.cgiのようにCookieによるインデックス作成オプ ションの記憶はできません). するとその実行ディレクトリにmindex.datが作られます. FTP等でサーバにアップロードすることで上のgenindex.cgiと同様のことが行えます.

  7. 検索してみて下さい.

     これで準備が整いました. いよいよ実際に検索してみて下さい. ブラウザに以下の様なURL(各ユーザ,プロバイダーによって違います)を入力し, 開いてみて下さい.
    http://www??.freeweb.ne.jp/???/???/cgi-bin/msearch.cgi
    以下のような検索用フォームが表示されます(実際には入力欄は空白で,更に下に 説明文が表示されます).

    例えば,旅行記という文字が含まれているページを検索する場合は,この 例のように入力欄にキーワード("旅行記")を入力し,検索ボタン を押します.
     後はgoogoogleと同じ要領です.

 検索フォームを自分のホームページに貼り付けたい場合は,FAQ を参照して下さい.
 また,インデックスは一度作ればそれで終わりではなく,自分のホームページの 更新を行った都度インデックスを更新して下さい. ページを追加したり,ページの修正をしたり,ページを削除した場合です. 追加されたページ,修正されたページ,削除されたページは自動的に判別し, インデックスを更新しますので,基本的に6で入力した値のままインデックスを作成 するだけです.

 カスタマイズの方法
 ここでは,設定ファイル(config.dat)を用いた各種設定方法と検索結果画面 およびヘルプ画面のカスタマイズの方法について説明します. ヘルプ画面とは,引数なしでmsearch.cgiを呼び出した時に表示される画面です. 1.40からカスタマイズは設定ファイルで行うようになり,perlのパスの変更以外 の全ての設定をこの設定ファイルで行うことができます. perlのパスさえ,ご自身の環境に合っていれば,msearch.cgiは全く触る必要が なくなりました.
 設定ファイルは,漢字コードがEUCで,改行コードが LFのみとなっています. ローカルで編集する場合はどのような漢字コードや改行コードでも構いませんが, アップロードする際には,EUCとLFに変換しておいて下さい. ほとんどのftpクライアントソフトはこの変換をサポートしているはずです.

 config.datファイルは下の図のような構成になっています.

 1の変数設定では,msearchが用いる各種変数を設定します. 2のフォーマット設定では,検索結果画面やヘルプ画面の見た目(フォーマット) を設定します. 以下,それぞれについて説明します. なお,config.dat中では,行頭に'#'を入れると,行末までをコメントとして 解釈します.

  1. 変数設定
    ここで設定できる変数は以下の通りです.
    変数名デフォルト値説明
    $home""(なし) フォーマット中で使える変数$$home$$の値となる(後述).
    $highlight1 検索結果に表示されるマッチ箇所の部分文字列中のキーワードをハイライト (強調表示)するかどうか.しない場合は0にする.
    $highlight_deco<b> 上のハイライトの方法.HTMLのタグで書く.
    $tzdiff0 サーバマシンのタイムゾーンと表示したいタイムゾーンとの時間差. 例えば,サーバが米国西海岸にあり,日本時間で表示したい場合は17とする.
    $notitleタイトルなし タイトルがないページのタイトル部分表示($$title$$で使用.後述)文字列.
    $log0 検索のログを出力するかどうか.出力する場合は1とする.
    $logfilemsearch.log 上の検索ログのファイル名.msearch.cgiの置いてあるディレクトリからの 相対パスで書く.
    $logencodingeuc-jp ログの漢字コードを指定する.SJIS(shift_jis)またはJIS(iso-2022-jp)も 指定できる.
    $date_format日時表示の書式を指定する.使える変数はyear(年),month(月),day(日), hour(時),minute(分),second(秒).1桁の数値は先頭に0が付く. config.datを参考のこと.
    $encodingeuc-jp msearch.cgiが出力するHTMLの漢字コードを指定する.例えば,i-mode用 の検索システムを作る場合はshift_jisを指定すればOK.iso-2022-jp(JIS)は 正常に検索できない可能性が高い(漢字INと漢字OUTの関係で).
    これらの変数の設定は,config.datのどこでも構わないが,各変数単位で, 行頭から以下のように記述する必要がある.
    set $home=http://www.kiteya.net/
    変数名(この場合$home)と=と値(この場合http://www.kiteya.net/)との間と,値 の後にはスペースやタブを入れないで下さい.
     これらの変数はデフォルト値以外の値を設定したい場合にのみ設定すれば OKです. 添付のconfig.datのサンプルでは,$homeのみ値を設定しています.

  2. フォーマット設定
     フォーマット設定とは,msearch(実際にはmsearch.cgi)の実行結果の画面表示 のテンプレートを作ることです. msearchの実行結果の画面は,検索結果画面とヘルプ画面の2つがあります. 検索結果画面とは,msearchを検索キーワードをつけて実行した時に出てくる画面 です. ヘルプ画面とは,msearchを引数なしで実行した時に出てくる画面です. こんな感じ です.
     フォーマットは,各画面毎にHTMLを使って定義します. この定義の一般系は,以下の通りです.
    begin format [num]
    HTML
    end
    formatはフォーマットの種類を指定し,numは繰り返し回数が必要な フォーマットの場合に指定し,HTMLの部分にフォーマットをHTMLを使って定義し, endで終了します. なお,変数設定(set)と同様にbeginとendは行頭から 記述して下さい.
     formatには,以下のものがあります.
    フォーマット繰り返し回数説明
    page不要 検索結果画面のフォーマット.
    result必要 検索結果のヒット項目のフォーマット(pageの下位フォーマット).
    previous不要 検索結果の直前の結果ページへのリンクのフォーマット (pageの下位フォーマット).現在表示中の検索結果が2ページ目だったら, 1ページ目に戻るためのリンク.
    next不要 検索結果の直後の結果ページへのリンクのフォーマット (pageの下位フォーマット).現在表示中の検索結果が1ページ目だったら, 2ページ目に進むためのリンク.
    pset必要 検索結果の現在表示ページより前のページを表示するリンクのフォーマット (pageの下位フォーマット).
    cset不要 検索結果の現在表示ページを表示するフォーマット(pageの下位フォーマット).
    nset必要 検索結果の現在表示ページより後のページを表示するリンクのフォーマット (pageの下位フォーマット).
    help不要 ヘルプ画面のフォーマット
     各フォーマット中では,どのようなHTMLでも記述することができます. スタイルシート等も使うことができますので,検索結果やヘルプ画面の見かけは ほぼ完全に自由に設定できます. ただ,1つ違うのは,このHTMLの中に特殊な変数を埋め込んでおくと,msearchが 自動的にその変数を該当する値に差し替えて表示する,という点です. この特殊な変数をフォーマット変数と呼びます. フォーマット変数は以下の通りです.
    フォーマット変数使えるフォーマット説明
    $$result$$page resultフォーマット.
    $$previous$$page previousフォーマット.
    $$next$$page nextフォーマット.
    $$pset$$page psetフォーマット.
    $$cset$$page csetフォーマット.
    $$nset$$page nsetフォーマット.
    $$encoding$$page,help 漢字コードの種類.charsetに使う.
    $$msearch$$page,help msearchのcgi名.
    $$home$$page,help ホームページのURL.
    $$query$$page 現在の検索式.
    $$rpp$$page,help 1ページあたりの表示件数.
    $$total$$page 検索結果の総数.
    $$set$$page,cset 現在の検索セット(表示ページ)の番号.
    $$from$$page 現在の表示ページに表示される先頭項目の通し番号.
    $$to$$page 現在の表示ページに表示される後尾項目の通し番号.
    $$displaynum$$page 現在の表示ページに表示される項目の件数.
    $$cputime$$page,help かかった処理時間.
    $$indexdate$$page,help インデックスの最終更新日時.
    $$indexnum$$page,help インデックスに登録されているページ総数.helpフォーマットでこの変数を 使うと若干表示が遅くなります(インデックスを読み込むため).
    $$nowdate$$page,help 現在日時.
    $$msearchhp$$page,help msearchの配布ページのURL.
    $$version$$page,help msearchのバージョン.
    $$resultnum$$result ヒット項目の通し番号.
    $$url$$result ヒット項目のURL.
    $$urldeco$$result ヒット項目のURL.ただし,URL検索の場合は,マッチ部分が強調されたURL となります.そのため,<a>タグ内では使わないで下さい.
    $$title$$result ヒット項目のタイトル.
    $$summary$$result ヒット項目のサマリー(マッチ部分文字列).
    $$previousurl$$previous 直前セット(前ページ)へのアクセスURL.
    $$nexturl$$next 直後セット(次ページ)へのアクセスURL.
    $$seturl$$pset,nset 検索セットへのアクセスURL.
    $$setnum$$pset,nset 検索セットの番号.
     この表のフォーマット変数のうち,赤字で書かれている フォーマット変数は特殊な変数です. 上のフォーマットの表に全く同じ名前のフォーマットがあることがポイントです. msearchは,pageフォーマット(検索結果画面)中のこれらの赤字のフォーマット 変数を見つけると,そのフォーマット変数を,フォーマット設定で定義した同じ 変数名のフォーマットで差し替えます. 分かり難いかもしれないので図で説明します.
     msearchは,pageフォーマットを用いて検索結果画面を作成します. pageフォーマット中に現れる普通のフォーマット変数(上の図だと$$msearch$$ や$$total$$などの青字で書かれた変数)は,msearch のメモリ中の値で入れ替えます. 図だと,$$msearch$$はmsearch.cgiに$$total$$は100という値で差し替えられます.
     そして特殊なフォーマット変数(上の図だと$$result$$や$$previous$$などの 赤字で書かれた変数)は,対応するフォーマット(この 場合はresultフォーマットやpreviousフォーマット)のHTMLで差し替えられます. この時対応するフォーマットの中にある普通のフォーマット変数は同様にmsearch のメモリ中の値に差し替えられます(上の図だと$$resultnum$$や$$url$$など).
     特殊なフォーマット変数のうち,$$result$$と$$pset$$と$$nset$$は,それぞれ 対応するフォーマットで設定した繰り返し回数分が繰り返されます. 上の図の場合だと,pageフォーマット中に$$result$$があります. そして$$result$$に対応するフォーマットresultは10回の繰り返し回数が設定 されています. 従って,pageフォーマットの$$result$$の位置に,begin result 10からendまでの 間にある3行が10回繰り返して表示されます. resultフォーマットで参照できるフォーマット変数は呼ばれる毎に値が変わります. この場合,検索結果のマッチ項目が順々に(検索結果の1件目,2件目というように) これらのフォーマット変数に入ることになります.
     また,これら繰り返し回数を指定するフォーマットは,指定された繰り返し 回数に満たない場合は途中で終了します. 例えば,begin result 10としていても,検索結果の件数が8件だと,8回しか 繰り返されません. また,begin pset 5としていても,現在表示しているページが3ページ目だと, 1ページ目と2ページ目の2回しか繰り返されません.
     繰り返し回数の指定をしなくても良いpreviousとnextも同様に表示すべき検索 セット(ページ)がない場合は表示されません. 例えば,検索結果の1ページ目だと,その前のページはないので,previous フォーマットは表示されず,$$previous$$は""(空文字列)で差し替えられます.

 以上でconfig.datの設定方法の説明を終りますが,具体的な書き方は添付の config.datをご覧下さい.

 また,config.datのみは,作者の許可なく再配布が可能です. かっこいいフォーマットができたら公開してみては如何でしょうか?
公開するHPのURLを作者まで連絡して頂ければ,フォーマット公開ページとして リンクしたいと思います. よろしくお願いします.

 genindex.cgiのカスタマイズの方法については割愛します. 一応1.3x以前と同じ変数は残していますが,今後なくなる可能性があります. どうしてもカスタマイズしたい場合は1.33の説明 ページのカスタマイズをご覧になって設定して下さい.  

 FAQ
  1. msearch.cgiやgenindex.cgiをメモ帳で見ると文字化けしているのですが.[全]

    msearchの各スクリプトはEUCという漢字コードで書かれています. そのため,windowsのメモ帳などSJIS漢字コードしか表示できないエディタでは 文字化けしているように見えてしまいます. EUCで書かれたファイルを表示,編集できるエディタをお使い下さい.
    そのようなエディタは Vectorのテキストエディタカテゴリーでたくさん見つけることができます.

  2. 検索フォームをページに貼り付けるには?[全]

    以下に例を示します.

    <form action="/cgi-bin/msearch.cgi" accept-charset="x-euc-jp">
    <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>
    
    このHTMLソースを検索フォームを入れたい場所に貼り付けるだけでOKです. ただし,赤色の部分は,そのページのURLから見たCGIの 相対パスか絶対パスを入れて下さい.

  3. 複数の対象ディレクトリをインデックス化するには?[全]

     基本的に不可能です. しかし,同じことを別の方法で実現することが可能です. 以下のようにします.
     あなたのホームディレクトリを"public_html/"以下とし,そのURLを "http://www.homepage.com/~id/",genindex.cgiがあるディレクトリを "cgi-bin/msearch/"とします. そして"public_html"以下のの"aaa/"ディレクトリと"bbb/"ディレクトリについて インデックスを作りたいとします.
     一方,"public_html/"以下には"aaa/"と"bbb/"以外に"ccc/"と"ddd/"という ディレクトリと"index.html"と"test.html"というファイルがあると仮定します. この場合,"aaa/"ディレクトリと"bbb/"ディレクトリの2つのディレクトリを対象 ディレクトリとしてインデックスを作るには,以下のようにします.
    対象ディレクトリ ../
    対象ディレクトリのURL http://www.homepage.com/~id/
    非対象ディレクトリ cgi-bin,ccc,ddd
    非対象ファイル index.html,test.html
    すなわち,2つのディレクトリを対象ディレクトリとするのではなく,2つの ディレクトリ以外を非対象ディレクトリとしてインデックスを作るのです.

  4. インデックスが作れないのですが?[全]

     いくつか原因が考えられます.

    1. ディレクトリ移動のパーミッションがない.
      genindex.cgiを置いてあるディレクトリのパーミッションは 755である必要があります(サーバによっては705でも OK).
    2. CGIからファイルを作ることができない制限になっている.
      サーバによってはCGIから新しいファイルを作ることができない設定になっている 場合があります. この場合は,mindex.datという大きさ0のファイルをgenindex.cgiの置いて あるディレクトリに作って下さい. ファイルのパーミッションは666にして下さい (サーバによっては606でもOK).
    3. CGIからのファイル読み込みに制限がかかっている.
      サーバによってはCGIから読み込むことができるファイル数に制限をかける設定に なっている場合があります. この場合は,少し手間がかかります.
       ファイル読み込みの制限がかからない程度をインデックス対象とするディレクトリ を指定し,インデックスを作ります.このインデックス(mindex.dat)をFTP等で ローカルにダウンロードし,別名(例えばmindex1.dat等)を付けて保存します. これを何度か繰り返し,インデックスに登録したい全部のファイルをインデックス化 したところで,ローカルにコピーしたインデックスファイル(例えば,mindex1.dat, mindex2.dat,mindex3.dat,.....等)をつなげて1つのインデックスファイル (mindex.dat)にし,CGIと同じディレクトリにFTP等でアップロードします.
    4. CGIのメモリ使用量に制限がかかっている.
      サーバによってはCGI1プロセスあたりのメモリ使用量に制限をかける設定になって いる場合があります. この場合も上と同様に分割してアップロードするか,genindex.plを使ってローカル PC上でインデックスファイルを作ってアップロードして下さい.
    5. プログラムのバグ.
      今のところバグは見つかっていませんが,可能性はあります.(^o^;

  5. 他のサーバにあるホームページをインデックスしたいのですが?[全]

     残念ながらできません. genindex.cgiが置いてあるサーバだけです. また,genindex.cgiを実際に動作させるユーザ(apache等のWebサーバ)が移動できる ディレクトリと参照できるファイルに限りインデックスに登録できます. ほどんどのサーバでは,同一サーバ上の別のユーザ(あなた以外のユーザ)の ディレクトリに移動したり,ファイルを参照したりすることはできなくなっている と思われますので,基本的にインデックスに登録できるのはあなたのホーム ディレクトリ以下だけです.

  6. いちいちインデックスを作り直すのが面倒なのですが.[1.2以上]

     もしあなたのお使いのWebサーバでcronが使えるなら定期的にインデックスを自動 更新することが可能です.(※cronって何?という人は諦めて下さい)
    インデックスの自動更新にはgenindex.plを使います. genindex.plは以下のように質問してきますので,それに合った値を用意し, shスクリプト(cshやperlでも勿論OK)を作ります.

    1. インデックス対象ディレクトリは?
    2. インデックス対象ディレクトリのURLは?
    3. インデックス対象ファイルの拡張子は?
    4. 非インデックス対象ディレクトリは?
    5. 非インデックス対象ファイルは?
    6. 非インデックス対象キーワードは?
    7. ランキング方法は?
    ただし,ランキング方法は0〜6の数値で答えなければなりません.
    [1] 最終更新日時-降順
    [2] 最終更新日時-昇順
    [3] タイトル-降順
    [4] タイトル-昇順
    [5] URL-降順
    [6] URL-昇順
    [0] なし
    例えばshスクリプトは以下のようになります. 値はインストール方法で使っている値を使っています. ランキングは[1]最終更新日時-降順です.
    (注)非対象キーワードに日本語を使う場合,shスクリプトの 漢字コードはEUCでなければなりません. また,非対象ディレクトリや非対象ファイルに正規表現を用いる場合は, shが展開しないようにクオートして下さい (この意味が分からない人は正規表現を使うのを諦めて下さい).
    ======== shスクリプトの例 =======
    #!/bin/sh
    
    ./genindex.pl <<HERE
    ../
    http://www.foo.co.jp/~bar
    .html,.htm,.shtml
    cgi-bin,secret
    secretfile.html
    検索,私
    1
    HERE
    ======== shスクリプトの例 =======
    
    後は,このスクリプトをautogenindex.shとでもして,パスの通ったディレクトリ に置きます. genindex.plはautogenindex.shと同じディレクトリに置いておきます. crontab -eで,このスクリプトを定期的に動かすようにすればOKです. 例えば,毎日午前0にインデックスを更新するためには以下のようにします.
    0 0 * * * autogenindex.sh

  7. 1.21と1.3のインデックスに互換性がありますか?[1.21&1.3]

     残念ながらありません. 1.21から1.3にアップデートするためには,1.21で作ったインデックス(mindex.dat) を削除し,1.3のgenindex.cgiで新しくインデックスを作り直して下さい.

  8. 1.31の「正しい全角1文字の検索」とは何ですか?[1.3以上]

     msearch1.3を含むほとんどのフリーの全文検索エンジン(漢字コードにEUCを用いて いるもの)では,「好」や「粒」や「隆」などの全角文字の1文字だけを検索 キーワードとして検索すると,それらの検索キーワードを含んでいないページを 検索してしまったり(適合率が低下),検索結果の一覧においてマッチ部分を強調 表示している場合,文字化けが起こったりします. これはEUC(正しくはEUC-JP)の漢字コードの構造上の問題です. 例えば,「好」という文字は,「0xB9 0xA5」という2バイトで構成されています. 一方,「テスト」という文字列の「ス」と「ト」はそれぞれ「0xA5 0xB9」と 「0xA5 0xC8」で構成されています. つまり,「スト」を連続して表すと, 「0xA5 0xB9 0xA5 0xC8」です. 本来なら「テスト」には「好」という文字は含まれないのですが,「スト」の 2バイト目と3バイト目(赤字部分)に「好」の 「0xB9 0xA5」がマッチしてしまいます. そのため,過剰検索(キーワードが本当は含まれないのに含まれていると判断 してしまう)が行われてしまいます. また,検索結果の一覧でマッチ部分を強調表示する時に 「スト」の「ス」の後半から「ト」の前半にかけて例えば<b>と</b> などのタグを挿入してしまい,そこから文字化けが発生してしまいます.
     バージョン1.31は,このような過剰検索や文字化けが起こらないようになって います. and検索,or検索,not検索,title検索いずれにおいても正常に検索することが できます. ただし,全角1文字の検索キーワードを使うと検索速度が格段に落ちてしまい ます. 作者のテスト環境では10倍以上遅くなってしまいます. しかし,全角1文字のキーワードを使わないなら,速度は1.3とほとんど変わり ません.
    (注) 1.40からはアルゴリズムを見直し,10倍以上の検索速度向上(つまり他の 検索とほぼ同等)を実現しています.

  9. 全角1文字のキーワードで検索すると止まってしまうのですが?[1.31〜1.33]

     WWWサーバマシンのメモリ不足が原因です.
     全角1文字のキーワードがある場合のみ,キーワードマッチのアルゴリズムを 変えています. 具体的には,perlのバージョン5以上で利用できる「先読み」の正規表現を使って います. そのため,マッチング対象(msearchでは対象ページ1ページに相当)の文字列の長さ が長い場合,メモリ不足でマッチングが止まってしまいます. これを回避するための仕組みがmsearchには備わっています. msearch.cgiの$g_maxsizeというパラメータです. デフォルトでは,20,000バイト以上の長さのページは20,000バイト相当でページを 分割してマッチングをします (この20,000バイトという数値は作者のサーバマシンでマッチングが止まらない サイズです.なお,1Gバイト以上のメモリを積んだサーバマシンで試したところ 20,000バイト以上でも大丈夫でした.). ですので,検索が止まってしまう場合はこの$g_maxsizeの値を少なく(例えば10,000) してみて下さい.
    (注) 1.40以上ではこの問題はなくなっています.

  10. 非対象キーワードで指定したキーワードが検索結果に出てくるのですが? [1.33以上]

     1.32以前のインデックスが存在する場合は,一度インデックスを削除してから, もう一度インデックスを作り直して下さい. 更新がされていないファイルは非対象キーワードを含んでいるかいないかに関わら ず,インデックスの更新はしないため,更新されていないファイルに含まれる非 対象キーワードが検索結果に出てくる可能性があります.
     また,非対象キーワードを変えた場合も同様にインデックスを一旦削除してから, インデックスを作り直して下さい.

  11. 検索結果を別フレームに表示する方法は?[全]

     FAQの2で示した検索フォームで説明すると,先頭の<form action...>を以下の ようにします.

    <form action="/cgi-bin/msearch.cgi" target=result accept-charset="x-euc-jp">
    
    赤色の部分は検索結果を表示したいフレーム名に適宜 変更して下さい.

  12. フォーマット変数$$url$$はどこが変わったの?[1.43以上]

     1.40〜1.42のフォーマット変数$$url$$にはバグが含まれており,URL検索が行わ れた場合,$$url$$には正しいURLではなく,強調表示されたURLがバインドされて いました. そのため,検索結果のタイトル部分をクリックしても正しいURLに飛ぶことができ ませんでした.
     1.43では正しいURLがバインドされる$$url$$と,強調表示がされる可能性がある (URL検索の場合)URLがバインドされる$$urldeco$$に分かれました. URL検索以外の検索方法の場合は,$$url$$と$$urldeco$$は全く同じ値がバインド されます.

  13. 1.43と1.44のインデックスに互換性がありますか?[1.43&1.44]

     残念ながらありません. 1.43から1.44にアップデートするためには,1.43で作ったインデックス(mindex.dat) を削除し,1.44のgenindex.cgiで新しくインデックスを作り直して下さい.

  14. IBM拡張漢字が入っていると文字化けがするのですが?[全]

     msearchはIBM拡張漢字に対応していません. お手数ですが,同体異文字に修正の上,ご利用下さい.

  15. genindex.plをWindowsのコマンドプロンプト上で実行すると文字化けするのですが?[全]

     Windowsのコマンドプロンプトの漢字コードはSJISです.genindex.plはデフォルト ではEUCで出力します. 実はgenindex.plには隠しコマンドがあります.

    C:\> perl genindex.pl -s
    のように"-s"とオプションを指定するとSJISでgenindex.plと対話できます. また,同様に"-j"とするとJISで出力されます(1.46以降).

Copyright (c) 1999-2002, Katsushi Matsuda. All Right Reserved.