|Home|私のLinux活用記録-Home-|

私のLinux活用記録

-Page16-

項目

kh16-01[Namazu 全文検索システムの導入]
kh16-02[私のコンピュータールーム]

 

[Namazu 全文検索システムの導入]

作成:2003年12月06日
修正:2005年03月13日

英訳パーリ語経典の掲載に伴って、当ホームページの収容ファイル数が 800 ファイルを越えました。これを機会に Namazu全文検索 システムを導入して、当ホームページ内検索の利便性を高めることにしました。特に英訳パーリ語経典の全文検索が可能になるので、役立つことと思います。

kh16-01.01 Namazu 全文検索システムの概要
kh16-01.02 Web Server での Namazu 全文検索システム構築
kh16-01.03 cron によるインデックスの自動メンテナンス

戻る

Namazu 全文検索システムの概要

http://www.namazu.org/ に詳細な解説が掲載されています。導入方法の概略は、
http://www.atmarkit.co.jp/flinux/special/namazu/namazu.html が参考になります。

必要なパッケージ(Vine linux 2.6r1)
namazu-2.0.12-0vl1.i386.rpm
kakasi-2.3.4-0vl2.i386.rpm
perl-5.6.1-0vl12.i386.rpm
perl-File-MMagic-1.12-0vl3.i386.rpm

必須ではありませんが、必要に応じて以下の関連パッケージもインストールしておくとよいでしょう。

namazu-devel-2.0.12-0vl1.i386.rpm
namazu_JFdb-20020115-0vl1.i386.rpm
namazu_JMANdb-05x04-20020115vl1.i386.rpm
namazu_VineDocsdb-2.5-0vl1.i386.rpm
kakasi-devel-2.3.4-0vl2.i386.rpm

[2004.10.28 追記]
Vine 3.0 では、namazu.cgi が、別パッケージに分けられています。
namazu-cgi-2.0.13-1vl3
を追加してインストールする必要があります。

インデックスの作成方法
$ mknmz -k -O INDEX_DIRECTORY DATA_DIRECTORY_1 DATA_DIRECTORY_2 ....
[注]
-k:日本語キーワード抽出に kakasi を使う
-O:インデックス出力先を指定(指定しない場合は、カレントディレクトリに出力する)
$ man mknmz でその他のオプションの使い方が確認できます。
デフォルトのインデックス作成対象ファイルは、*.txt ファイル、*.html ファイルです。

検索と結果出力
$ namazu -a -h "KEY_WORD" INDEX_DIRECTORY > result.html
[注]
-a:検索結果を全て出力
-h:html フォーマットで出力
$ man namazu でその他のオプションの使い方が確認できます。
出力される html ファイルのフォーマットは、/usr/share/namazu/template 配下の下記テンプレートファイルから作成されます。

NMZ.head.ja:検索結果の冒頭部分
NMZ.foot.ja:検索結果の末尾部分
NMZ.body.ja:検索式の説明
NMZ.tips.ja:検索のコツ
NMZ.result.ja:検索結果の表示書式

戻る

Web Server での Namazu 全文検索システム構築

当ホームページ上での Nmazu 全文検索システム構築の概要を以下に紹介します。

ホームページ用コンテンツのディレクトリ
/mnt/hdc1/public_html/       (http://panna.zive.net/ に対応)
/mnt/hdc1/public_html/linux  (http://panna.zive.net/linux に対応)
/mnt/hdc1/public_html/bukkyo (http://panna.zive.net/bukkyo に対応)
/mnt/hdc1/public_html/syasin (http://panna.zive.net/syasin に対応)
/mnt/hdc1/public_html/canon  (http://panna.zive.net/canon に対応)

インデックス用ディレクトリ
/mnt/hdc1/namazu/
/mnt/hdc1/namazu/all
/mnt/hdc1/namazu/linux
/mnt/hdc1/namazu/bukkyo
/mnt/hdc1/namazu/syasin
/mnt/hdc1/namazu/canon

入出力インターフェースの準備(検索入力画面と結果出力画面)
入出力は、namazu.cgi を実行することでおこなわれます。また、namazu.cgi は、.namazurc の設定を参照して実行されます。デフォルトでは、namazu.cgi と .namazurc ファイルは、/home/httpd/cgi-bin/ 配下に置かれているので、これを /mnt/hdc1/public_html/ 配下にコピーし、所有者、グループを USER_NAME に変更します。

# cp /home/httpd/cgi-bin/namazu.cgi /mnt/hdc1/public_html/
# cp /home/httpd/cgi-bin/.namzurc /mnt/hdc1/public.html/
# cd /mnt/hdc1/public_html
# chown USER_NAME namazu.cgi
# chgrp USER_NAME namazu.cgi
# chown USER_NAME .namazurc
# chgrp USER_NAME .namazurc

検索用 web 画面のテンプレートファイルの編集
検索用 web 画面のテンプレートファイルは、前記したとおりですが、当ホームページでは体裁を統一するため、以下のファイルを編集しました。
/usr/share/namazu/template/NMZ.head.ja
/usr/share/namazu/template/NMZ.foot.ja

■ /usr/share/namazu/template/NMZ.head.ja の編集
01. 前略
02. <link rel="stylesheet" href="style_dft.css" type="text/css">

03. </head>
04. <body lang="ja">
05. <p><a name="homep"></a>
06. <table border="0" width="720px" style="color: #000000; background-color: #ffffff">
07. <tr><td>
08. <div class="main-doc">
09. &nbsp;
10. <br><b>|<a href="index.html">Home</a>|<a href="linux/index.html">私のLinux活用記録</a>|<a href="bukkyo/index.html">仏教の部屋</a>|<a href="syasin/index.html">私の写真室</a>|</b>
11. <hr>
12. <div class="center">

13. <h1>Namazu による全文検索システム</h1>
14. </div>
15. <hr>

16. 中略
17. <strong>検索対象:</strong>
18. <ul>
19. <li><input type="checkbox" name="idxname" value="all" checked>全て
20. <li><input type="checkbox" name="idxname" value="linux">私のLinux活用記録
21. <li><input type="checkbox" name="idxname" value="bukkyo">仏教の部屋
22. <li><input type="checkbox" name="idxname" value="syasin">私の写真室
23. <li><input type="checkbox" name="idxname" value="canon">英訳パーリ語経典

24. </ul>
25. </form>

[説明]
緑字部分が追記 or 編集した部分です。
Line 02, 05-12, 14-15 は、html ファイルの体裁を整えるための記述です。
Line 19-23 は、検索画面の検索対象を選択するための入力フォームです。
Line 19-23 における value の値は、インデックス用ディレクトリ /mnt/hdc1/namazu/ 配下の各インデックスディレクトリ名を記述します。

■ /usr/share/namazu/template/NMZ.foot.ja の編集
01. 前略
02. </address>
03. &nbsp;
04. </div>
05. </td></tr>
06. </table>

07. </body>
08. </html>

[説明]
緑字の部分は、html ファイルの体裁を整えるための、NMZ.head.ja に対応した記述です。

.namazurc の編集
.namazurc は、namazu.cgi 実行時に、参照するインデックス用ディレクトリ(Index)、検索入力画面及び結果出力画面のテンプレートファイルの配置ディレクトリ(Template)、検索結果のファイルの所在パスを URI(URL) に変換するための条件(Replace)、使用言語(Lang) 等を設定するためのファイルです。.namzurc の内容を以下のように設定しました。

Index     /mnt/hdc1/namazu/
Template  /mnt/hdc1/namazu/all/
Replace   /mnt/hdc1/public_html/   http://panna.zive.net/
Lang      ja    (デフォルト)
Scoring   tfidf (デフォルト)

[説明]
■ Index
インデックスを作成する元ディレクトリとして、/mnt/hdc1/namazu/ を指定します。この配下に、個別のインデックス用ディレクトリ (linux, bukkyo, syasin, canon) が配置されています。
■ Template
mknmz を実行してインデックスを作成すると、インデックス用ディレクトリに、検索入力画面及び結果出力画面のテンプレートファイルが作成されます。このテンプレートファイルは、/usr/share/namazu/template 配下のテンプレートファイルを参照して作成され、インデックス化された文書数、登録されたキーワード数などが記述されます。
ここでは、当ホームページの全てのファイルを対象にしたインデックスを /mnt/hdc1/namazu/all 配下にに作成しますので、入出力画面のテンプレートファイルの所在を、/mnt/hdc1/namazu/all/ としています。
■ Replace
検索でヒットしたファイルの所在は、サーバー上のフルパスで記録されますが、そのままではインターネットから Web Server にアクセスができません。そこで、サーバー上のフルパスをインターネットからアクセス可能な URI(URL) に変換します。ここでは、フルパスの /mnt/hdc1/public_html/ の部分を http://panna.zive.net/ に置き換えるように設定しています。

インデックスの作成
当ホームページは、/mnt/hdc1/public_html/ 配下に作成されています。
/mnt/hdc1/public_html/ 配下には、linux, bukkyo, syasin, canon の各ディレクトリが配置されています。全てのディレクトリとファイルのインデックス、及び各下位ディレクトリ毎のファイルのインデックスを下記のように作成します。

$ cd /mnt/hdc1/public_html
$ mknmz -k -O ../namazu/all linux bukkyo syasin canon
$ mknmz -k -O ../namazu/linux linux
$ mknmz -k -O ../namazu/bukkyo bukkyo
$ mknmz -k -O ../namazu/syasin syasin
$ mknmz -k -O ../namazu/canon canon

[2003.12.10 追記]
検索結果の表示で、[著者]欄が不明となっていましたが、検索した html ファイルの <meta name="Author" content="Shuji Tamura"> から、[著者]欄に "Shuji Tamura" を表示させる方法を namazu.org で調べたところ、
http://www.namazu.org/ml/namazu-users-ja/msg01582.html にずばりの記事がありました。
/usr/share/namazu/filter/html.pl の 148行目を書き換えることで可能になります。

148行目の変更前
if ($$contref =~ m!<LINK\s[^>]*?HREF=([\"\'])mailto:(.*?)\1\s*>!i) { #"

148行目の変更後
if ($$contref =~ m!<META\sNAME=([\"\'])AUTHOR\1\s[^>]*?CONTENT=\1(.*?)\1\s*>!i) { #"

[2006.08.26 追記]
HTML ドキュメントを XHTML に変更した場合、上記のスクリプトでは、 「著者」欄が不明となってしまいます。理由は、メタ情報の表記が
<meta name="Author" content="Shuji Tamura"> から
<meta name="Author" content="Shuji Tamura" />
に変わるため、スクリプト中の正規表現にマッチしないためです。該当のスクリプトを以下のように書き換えれば、反映することができます。
if ($$contref =~ m!<META\sNAME=([\"\'])AUTHOR\1\s[^>]*?CONTENT=\1(.*?)\1\s*/?>!i) { #"
なお、もっと汎用性を考慮した正規表現は、以下のようです。
if ($$contref =~ m!<META\s[^>]*?NAME=([\"\']?)AUTHOR\1\s[^>]*?CONTENT=([\"\']?)(.*?)\2\s*/?>!is) { #"

[補足]
スクリプト中の正規表現について

正規表現によるマッチングの一般式

    m/正規表現/i (『/』は、『!』『|』『#』でも可)

    m/ : マッチングをおこなう
    /i : マッチングの際、大文字小文字を区別しない
    /s : 文字列を単一行として扱う。途中に [改行] (\n) があっても、その前後は
         $ や ^ にマッチしない。 s を指定すると、. (ピリオド) は \n にマッチ
         するようになる。

正規表現の例
\s       : 『空白』一文字
\"       : 『"』
\'       : 『'』
[\"\']   : 『"』、『'』のどちらか
([\"\']) : [\"\'] をひと纒まりの正規表現(部分正規表現) として扱う。
         : 後の正規表現の中で、\n (n=1, 2, 3, ...) として引用される。
         : n は、部分正規表現が表れた順番を示す。
         : 『(』『)』は、GNU grep -Eオプション、Perl正規表現で有効。
[^>]     : 『>』以外の文字
*        : 直前に書かれた部分正規表現の 0回以上のくり返し
?        : 直前に書かれた部分正規表現、または『空文字列』
*?       : 直前に書かれた部分正規表現の 0回以上のくり返し
[^>]*?   : 『>』以外の文字の 0回以上のくり返し
.        : 任意のキャラクター一文字
.*       : 任意のキャラクターの 0回以上のくり返し
.*?      : 任意のキャラクターの 0回以上のくり返し

正規表現については、こちら も参照してください。
また、正規表現について詳しく知りたい場合は、以下が大変参考になりま す。
http://www.kt.rim.or.jp/~kbk/regex/regex.html

Web Server での namazu.cgi の実行
当ホームページでは、namazu.cgi を http://panna.zive.net/ (/mnt/hdc1/public_html/) に置いていますので、namazu.cgi を実行させたい html ファイルに以下を記述します。
<a href="http://panna.zive.net/namazu.cgi">Namazu全文検索</a>

戻る

cron によるインデックスの自動メンテナンス

[2005.03.13 修正]

cron を使ったインデックスの自動更新、無効化したインデックスの自動削除および、/etc/crontab についての簡単な説明を追記しました。

インデックスの自動更新
■ ファイルの新規作成、更新、削除にともなう、インデックスの更新は、インデックス作成と同じ mknmz コマンドを実行するだけで行われます。ここでは、

$ cd /mnt/hdc/public_html
$ mknmz -k -O ../namazu/all linux bukkyo syasin canon
$ mknmz -k -O ../namazu/linux linux
$ mknmz -k -O ../namazu/bukkyo bukkyo
$ mknmz -k -O ../namazu/syasin syasin
$ mknmz -k -O ../namazu/canon canon

で更新されます。cron を用いてこれを自動的に行うには、上記コマンドをシェルスクリプトファイル(ここでは、namazu.sh としました) に記述し、これを cron を用いて実行します。

■ namazu.sh の内容
---------------- 以下 namazu.sh ----------------
#!/bin/sh
export LANG=ja_JP.ujis
set PERL_BADLANG=0
export PERL_BADLANG
cd /mnt/hdc/public_html
mknmz -k -O ../namazu/all linux bukkyo syasin canon
mknmz -k -O ../namazu/linux linux
mknmz -k -O ../namazu/bukkyo bukkyo
mknmz -k -O ../namazu/syasin syasin
mknmz -k -O ../namazu/canon canon
---------------- 以上 namazu.sh ----------------

■ 次に、namazu.sh を適当なディレクトリに配置し、実行権限を設定します。ここでは、/usr/local/bin/ 配下に配置し、実行権限を以下のように設定しました。

# chown USER_NAME namazu.sh
# chgrp USER_NAME namazu.sh
# chmod 700 namazu.sh

■ 毎日午前 2時に自動的に namazu.sh を実行させるために、/etc/crontab を以下のように編集します。

---------------- 以下 /etc/crontab ----------------
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
 
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
00 2 * * * USER_NAME /usr/local/bin/namazu.sh <=== この行を追記
-------------- 以上 /etc/crontab ----------------

無効化したインデックスの自動削除
インデックス更新を何度も繰り返すと、古いファイルの無効化したインデックスが溜まってくるため、これを削除する必要があります。これも、cron を用いて自動処理することにします。

■ 無効化したインデックスの削除コマンド gcnmz INDEX_DIRECTORY を用いて、cron で実行するシェルスクリプトファイル(ここでは、gcnmz.sh) を作成します。

-------------- 以下 gcnmz.sh ----------------
#!/bin/sh
gcnmz /mnt/hdc1/namazu/all
gcnmz /mnt/hdc1/namazu/linux
gcnmz /mnt/hdc1/namazu/bukkyo
gcnmz /mnt/hdc1/namazu/syasin
gcnmz /mnt/hdc1/namazu/canon
-------------- 以上 gcnmz.sh ----------------

■ 次に、gcnmz.sh を適当なディレクトリに配置し、実行権限を設定します。ここでは、/usr/local/bin/ 配下に配置し、実行権限を以下のように設定しました。

# chown USER_NAME gcnmz.sh
# chgrp USER_NAME gcnmz.sh
# chmod 700 gcnmz.sh

■ 毎週日曜日、午前 2時20分に gcnmz.sh を実行させるために、/etc/crontab を以下のように編集します。

---------------- 以下 /etc/crontab ----------------
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
 
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
00 2 * * * USER_NAME /usr/local/bin/namazu.sh
20 2 * * 0 USER_NAME /usr/local/bin/gcnmz.sh <=== この行を追記
-------------- 以上 /etc/crontab ----------------

/etc/crontab について(参考)
/etc/rc.d/crond が 1分おきに /etc/crontab を参照し、該当する条件のスクリプトを実行します。

■ /etc/crontab 記述内容の意味

SHELL=/bin/bash <=== 使用シェルの指定
PATH=/sbin:/bin:/usr/sbin:/usr/bin <=== プログラム実行時のデフォルトパス
MAILTO=root <=== 実行時に送るメールの宛先
HOME=/ <=== cron 実行時のホームディレクトリ
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
│││││ │   │        └実行プログラムスのあるディレクトリ
│││││ │   └/etc/cron.*/ 配下にあるスクリプトの実行を指示
│││││ └実行権限者(root,ユーザー)
││││└曜日(0=Sun,....,6=Sat)┐
│││└月(1=Jan,....,12=Dec)  │
││└日(1,....,31)       │実行タイミング
│└時間(0,....,23)       │
└分(0,....,59)         │
*:全ての条件          ┘

任意のスクリプトファイル(実行プログラム) を cron によって実行するには、run-parts が指定するディレクトリ配下にスクリプトファイルを配置するか、適当なディレクトリに配置したうえで、/etc/crontab に実行タイミングと実行権限者およびスクリプトファイルのフルパスを記述するか 2通りの方法があります。後者では、単一スクリプトファイル毎に実行タイミングと実行権限者を決めることができます。

cron により毎日実行される、デフォルトの実行プログラムには以下のものがあります。

■ /etc/cron.daily/ 配下(毎日 4時02分に実行)

□ 0anacron
anacron -u cron.daily を実行
cron.daily は実行時のタイムスタンプを行う

□ makewhatis.cron
whatis のデータベース作成

□ slocate.cron
slocate のデータベースアップデート

□ tmpwatch
アクセスされないファイルの削除

□ postfix
postfix のチェック

□ tetex.cron
90日間以上使用されない Tex Fonts の削除

□ logrotate
/etc/logrotate.conf に従って、logrotate を実行

[参考] 2004.04.29 追記
ログファイルの管理上、手動で logrotate を実行する必要がある場合には、
# /usr/sbin/logrotate -f /etc/logrotate.conf
を実行します。ただし、直前のログファイルやバックログファイルが消失するので、必要なら事前にバックアップしておきます。

□□ /etc/logrotate.conf
ログローテイトは1週単位、バックログは4回分、新規ログファイル作成
/etc/logrotate.d 配下のプログラムを実行

□□□ /etc/logrotate.d/ 配下のプログラム
各サーバー、ログファイル毎に、新規ログファイルを認識
apache, named, ppxp, samba, squid, syslogd

戻る

[私のコンピュータールーム]

作成:2003年12月07日
修正:2008年4月21日

http://panna.zive.net(Shuji Tamura's Home Page / 現在は、http://panna.dyndns.org/ に変わっています) を発信している、私のコンピュータールームの自己紹介です。

東京勤務のため、大津市の自宅からここ横浜の単身赴任寮に移り住んで早四年半が経ちました。この部屋は 10畳の広さがあってパソコンラックと普通の机を置いても十分な広さです。他には何もないのですが....。西日が入るので、夏場の室温上昇には気を使っています。猛暑のときは、35度設定でクーラーをいれて出勤することもしばしばです。

つまらない前置きが長くなりましたが、私のコンピュータールームの機器の写真と簡単な説明を書いてみました。
 

私のコンピュータールーム1
自慢(自分だけ?) の PC オーディオ機器です。SA-PC5 は SONY のフルレンジスピーカー、左右独立で各々 15W パワーアンプを持っています。真中の YST-MSW8 は、YAMAHA のスーパーウーハー、これも 15W のパワーアンプ駆動です。ジャズ、ボーカル、クラシックピアノ、シンフォニー、歌曲、楽劇、何でもこなします。現在は PC につながず、SONY の 携帯型 CDプレイヤーにつないで使っています。
 
私のコンピュータールーム2
当ルームのメインマシン群 ?
■ ibm133 が ルーター兼 Web Server で、今年の 4月に知人からもらい受けたものです。Vine Linux 2.6r1 をインストール後 CD-ROM 装置をはずし、余っていたハードディスクを増設して (4GB + 5GB) にしています。メモリーも余っていたノーブランド品 256MB を増設(128MB だけ認識) し、192MB にしています。機種は、IBM Aptiva E-133(AMD-K6-2 333MHz) です。
■ ph700 は、ローカルのファイルサーバー、兼 PPP Server、兼インターネット向け SSH2 Server(ibm133 経由) です。機種は、PLAT' Home Entry System 700i(PentiumIII 800MHz, MEM=256MB) です。DFML-560E(I・O DATA 電話モデム) を PPP Server 用モデムとして接続しています。
■ gw450 は、Vine Linux 2.5, Windows98 デュアルブートのローカルマシンで、モニターが接続された唯一のマシンです。機種は、Gateway GP7-450(PentiumIII 450MHz, MEM=256MB) で、HDXG-S80(I・O DATA SCSI HDD 80GB) を接続しています。
 
私のコンピュータールーム3
■ Modem-N II は、NTT のフレッツADSL 用モデム、いまだに 1.5M ですが、特に不都合はありません。
■ HUB5PL は、Corega の 10M タイプハブです。これも時代おくれのスペックですが、特に不都合はありません。
■ GT-8200UF は、EPSON のスキャナー、写真のネガ、ポジフィルムから 6枚単位で画像が読み込めます。gw450 に接続していますが、Windows で使う唯一の機械です。
■ Libretto 50 は、電源アダプターがないため、置いてあるだけです。

戻る

counter1counter2counter3counter4counter5counter6

|Home|
 
Valid XHTML 1.1 Valid CSS!