blosxom のサイト内検索を msearch に変更
少し前から、当ブログのサイト内検索をインデックス作成型の全文検索エンジンの msearch に切り替えています。以前は blosxom の find プラグインを使用してきましたが、インデックス型の方が検索が高速で負荷も低い(だろう)という判断です。
msearch を blosxom で使用するには、若干、msearch の改造が必要でした。以下に、どのような改造をしたのかを紹介します。ただ私は Perl については詳しくないので、たぶんおかしな部分が含まれていたり、もっと上手い書き方があると思います。一応、手元の環境(blosxom starter kit、文字コード UTF-8)では動作していますが、動作の保証はいたしません(Unicode 以外の文字コードを使用している場合は、動作しません)。
msearch の入手と設置
当ブログでは文字コード UTF-8 で記事を保存しているので、オリジナルの msearch ではなく、msearch の Unicode 対応版を使用しています。HP内全文検索エンジン - Unicode版msearch から入手可能です。
msearch の設置についてはきてーや.ねっと / スクリプト / msearch、msearch導入記とHP内全文検索エンジン - Unicode版msearchが参考になります。
以下、設置にあたり、注意したほうがいいと思う点をメモ:
- Unicode 版はファイルによって文字コードが EUC だったり UTF-8 だったりするので、両方の文字コードを扱えるテキストエディタを使用し、文字コードの設定も間違えないように気をつける。
- msearch のインデックス作成には、genindex.cgi(CGI として動作させる)か genindex.pl(コマンドラインで実行する)のどちらかを使用する。
- でも、インデックスの作成は Web サーバー上で行うより、(genindex.cgi/genindex.pl のどちらでもいいので)ローカルで行ったほうが無難。
genindex.pl の改造
まず、msearch掲示板 - Re(5):Perlでインデックスの自動更新を参考に(ていうか、そのまま使わせていただいて) genindex.pl を改造しました。コマンドライン実行時にインデックス作成に関する設定を行いたい場合や CGI(genindex.cgi)でインデックスを作成する場合、この改造は必要ありません。
私の場合、ブログと同じフォルダ構成でローカルに記事を保存し、インデックスの作成もローカルでコマンドラインから行っています。しかし、インデックス作成時に、毎回、設定を入力するのは手間です(とくに設定が固定されているような場合)。この改造により Perl スクリプトの中に設定を埋め込めるため、インデックスを作成する際には設定の入力をスキップできるようになります。
注意すべき点
- インデックス対象を .txt にすること。もし blosxom の設定で記事の拡張子を .txt 以外に設定しているなら、その拡張子を指定。
- jcode.pl などのパス設定に注意。コマンドラインから実行するときは、cd コマンドで msearch のフォルダにカレントディレクトリを変更するといいみたい。例:
cd C:\msearch\
perl genindex.pl
indexing.pl の改造
次に indexing.pl を改造します。こちらが実際にインデックスを作成するスクリプトのようです。改造にあたっては、msearch掲示板 - 掲示板の過去ログを検索したいのですが問題が。を参考にしました。
変更点は、以下の 3 箇所です。
URL を .txt から .htm に置換
私の場合、記事ファイルの拡張子は .txt(blosxom starter kit のデフォルト)で、個別の記事の URL の拡張子は .htm です。しかし、indexing.pl のデフォルトでは、インデックス対象ファイルの拡張子がそのまま検索結果で表示される URL の拡張子(つまり http://example.com/foo.txt みたいな感じ)になってしまいます。
そこで、正規表現で .txt を .htm に置換することにします。indexing.pl の 707 行目あたりに、次の 3 行を追加します。実際に必要なのは 1 行のみですが、変更点がわかりやすいように「ここから追加」と「ここまで追加」というコメントを追加しています。
## URLの作成
$url = $file;
$url =~ s/^$target_dir/$target_url/;
### ここから追加 ###
$url =~ s/\.txt$/.htm/; # URL の最後の .txt を .htm に置換
### ここまで追加 ###
タイトルを記事の 1 行目から取得
indexing.pl のデフォルトでは、HTML の title 要素からタイトルを取得します。blosxom では記事の 1 行目がタイトルなので、そこから取得するようにします。
indexing.pl の 731 行目あたりに、以下のスクリプトを追加します。改行の直前までをマッチさせたいので、改行の削除が行われる直前に持ってきました。
## 漢字コードの変換
if($utf_mode) { # ★
&utfjp::convert(\$contents, "utf8"); # UTF-8に変換
### ここから追加 ###
## タイトルを取得する
$contents =~ /^(.+?)\n/i; # 1 行目がタイトルなので最初の改行の直前までを取り出す
$title = $1;
$title =~ s/\s+/ /g;
$title =~ s/^\s+//;
&utfjp::utf8h2z_kana(\$title); # 半角カナを全角カナに変換
### ここまで追加 ###
&utfjp::chop_eol(\$contents,"utf8"); # 改行の削除
&utfjp::utf8h2z_kana(\$contents); # 半角カナを全角カナに変換
} else {
&jcode::convert(\$contents, "euc", "", "z"); # 半角カナを全角カナに変換
}
その直後にある、従来のタイトル取得部分は不要ですので、以下のようにコメントアウトしました。if 文以降は、そのまま変更しません。
## タイトルを取得する
### ここから変更 ###
#$contents =~ /<title.*?>(.*?)<\/title>/i;
#$contents =~ /^(.+?)$/i;
#$title = $1;
#$title =~ s/\s+/ /g;
#$title =~ s/^\s+//;
### ここまで変更 ###
if($utf_mode) { # ★
&utfjp::ref_to_utf8(\$title); # 文字参照を文字そのものに置換(titleタグが拾えているのでHTML間違いなし)
&utfjp::utf8z2h_an(\$title);
タイトルは元から記事に含まれているので、含めないようにする。
上にも書いたように、blosxom では記事の 1 行目にタイトルが含まれています。このため、以下の部分(上の改造点の直後。765 行目あたり)をコメントアウトします。こうしないと、インデックスにタイトルが 2 つも含まれることになります。
## タイトル文字も本文に含める
### ここから変更 ###
# blosxom の記事には最初からタイトルが含まれているので不要
#$contents = $title . $contents;
### ここまで変更 ###
検索ボックスの設置
最後に検索ボックスを設置します。私の場合、foot.html と foot.htm に次のような HTML コードを埋め込んでいます。
<div class="sidetitle">
Search
</div><!-- sidetitle end -->
<div class="side">
<form action="http://example.com/msearch/msearch.cgi" accept-charset="utf-8">
<input type="text" size="16" name="query" value="">
<input type="submit" value="検索">
<input type="hidden" name="hint" value="ひらがな">
<input type="hidden" name="index" value="">
<input type="hidden" name="config" value="">
</form>
</div><!-- side end -->
インデックスファイルの名前を default.idx 以外に設定している場合は、index という name 属性の値(value)にインデックスファイル名(.idx を除く)を指定します。詳しくは、msearch導入記 の「●複数の検索エンジンを設置したい(インデックスの切り替え)」を参照してください。
2007-03-28 追記
「URL を .txt から .htm に置換」の正規表現において、「.(ドット)」を文字そのものとして扱うためのバックスラッシュ(円記号)が抜けていました(ブログの記事を HTML 形式に変換する際に抜けてしまったようです)。これでは、ドットが任意の一文字にマッチするメタ記号として扱われることになります。つまり、もし「任意の一文字txt」という文字列(atxt でも btxt でもよい)を含む名前のファイルがあった場合に、ファイル名を元に取り出される URL が「http://~.htm~.txt」のように拡張子以外の部分が「.htm」に置換されてしまいます。
現在は正規表現を訂正してありますので、もしこのページを参考に msearch を改造された方があれば、お手数ですが修正してください。修正したら、念のため、インデックスを 1 から作り直してください。よろしくお願いします。
スポンサード リンク
writeback message: There was a problem posting your writeback.
- [Preview]ボタンをクリックすると、コメント内容をプレビューすることができます(JavaScript使用)。
- スパム対策としてリファラチェックを行っています。セキュリティソフトの設定でリファラを無効にしていると投稿できません。
- エントリの内容と無関係と思われるコメントやトラックバックは削除されます。
- 当ブログへの言及リンクがないトラックバックはブロックされます。




