Front Page  ページ一覧  検索  更新履歴  編集履歴  PageRank  RSS  ソース  ログイン  HikiFarm

tDiaryでmsearch 差分 - NOB's Wiki

  • 最後の更新で追加された部分はこのように表示します。
  • 最後の更新で削除された部分はこのように表示します。

!tDiaryに検索機能を付ける
先月から使っているtDiaryに検索機能を付けるために行った作業をまとめました。参考にされる方が出てくれば存外の喜びです。

まず、tDiaryで検索機能を実現するには、日記のデータを別ディレクトリにHTMLで書き出して、そのHTMLを検索対象にする必要があります。サーチエンジンはこのHTMLを検索するわけです。

で、目的の文章が見つかればアンカーを選択するわけですが、このときまともにそのHTMLを表示してもテーマや画像などが表示されず味気ない状態なので、何らかの方法でその日の実際の日記に飛ばしてやることが必要です。

![squeeze.rb]HTMLの書き出し
tDiaryにsqueeze.rbというプラグインを入れると、記述した日記をその日ごとにHTMLに自動で書き出してくれる。tdiary.conf内のオプションを設定する必要がある。何も設定しないと現在の日記のデータ配下に書き出されるのでwwwから参照できないため検索も出来ない。また、保存形式も年度ごとにまとめられ'''yyyy/mmdd'''となるのですが、これが検索では使いにくいようですから、一つのフォルダに'''yyyyymmdd'''形式で保存するように設定します。
#tdiary.confの設定例
 
@options['squeeze.output_path'] = './html/'
@options['squeeze.compat_path'] = true
#1行目は、出来上がったHTMLを書き出すディレクトリです。tDiaryディレクトリの下にhtmlというフォルダを作って保存します。
#2行目は、tDiary1.4互換モードらしいですが、いわゆる一つのフォルダに全て'''yyyyymmdd'''形式で保存するために'''true'''に設定します。
ここで指定した./html/ディレクトリはftpなどで作っておきwwwから書き込みが出来るようにしておく必要があります。これで準備は完了。

![squeeze.rb]過去の日記データの書き出し
これまでの設定でこれから書き込み日記は全てhtmlで指定したディレクトリに保存されていきますが、過去の日記も検索対象にしたい場合は一括変換する必要があります。

squeeze.rbをCGIかコマンドとして使えば一気に変換が可能です。CGIで動かした場合はtdiary.confを参照してオプションを読みとって自動で設定したディレクトリに書き出してくれます。その様子はブラウザで確認できます。

CGIに制限を掛けているレンタルサーバーも多いので、読み込むファイルが多すぎたり書き出すファイルが多すぎると途中で止まってしまって、完了しない場合があります。こんなときはtelnet(SSH)でログオンしてコマンドで実行すると難なく出来る場合が多いです。(うちのサーバーの場合)

![msearch]msearchを選んだ理由
全文検索と言えばnamazuが非常に有名です。当然namazuも候補に入れて検討しましたが。namazuは'''C'''で書かれているので、サーバー上でコンパイルする必要があります。僕のようなレンタルサーバーではまず不可能。

そんな場合に用意されているのがpnamazuというnamazuのPerl版です。これならPerlのCGIとして動くのでほとんどの人が設置できると思われます。しかしnamazuはCで書かれているから高速なのであって、Perl版ではどうかなと思ったのと、Perl版で同じくインデックスタイプの全文検索ではmsearchがもっぱら使われていることを知り、私たち個人で運用する程度のサイトには一番合っていると評判が高かったからです。

'''後の情報によると、レンタルサーバーでは無理と思っていたが出来そうな感じもしてきた。時間が出来たら試してみようと思う。'''

実際に使ってみるとインデックスの生成も非常に高速で、検索もすこぶる快適です。知り合いに勧めた経緯もあるし、はき出すhtmlを自分でvalidにした経緯もあるので、使い続けています。

![msearch]index作成
squeeze.rbでhtmlを生成したらいよいよmsearch用indexの作成です。msearchのHELPでは、ブラウザからgenindex.cgiにアクセスして作成するように書かれています。ほとんどの場合これで問題なく行くはずですが、いちいち手作業でindexを作るのはめんどくさがりの僕には不向きですし、長期間更新を忘れてしまう可能性があるので、何とか自動で出来ないかを模索しました。もちろんgenindex.cgiで作っても何ら問題有りません。

また、借りているサーバーの関係でCGIからのファイルの読み込みや書き出しに制限を設けている場合があります。うちの場合はこれでindexの作成が完結しませんでした。このような場合の対策は自分のマシンをサーバーに仕立ててローカルでindexを作ってftpでアップするか、telnet(SSH)でサーバーにログインしてコマンドで作成するかのどちらかです。

めんどくさがりの僕は当然、コマンドでの自動生成を目指すわけです:-)

![msearch]用途別index
設置するmsearchは一つで、複数の要求に応じるための準備をします。msearchは1.5系列から複数のindexファイルを持つことが出来ますし、複数のconfig(設定)ファイルも持つことが出来ます。そこで、サイト全体のindex、tDiary用に僕とおみさんそれぞれのindexを作ることにしました。

![msearch]コマンドでindex
ブラウザからindexが作れなかったので、今度はコマンドからの挑戦です。

msearchのサイトの[[FAQ|http://www.kiteya.net/script/msearch/#faq]]の'''6.いちいちインデックスを作り直すのが面倒なのですが'''を見るとindexファイルの自動生成方法が書かれているので参考にした。aoutogenindex.sh等という名前で以下のシェルスクリプトを書きます。(#以降の文字は不要)
#!/bin/sh↓                 #シェルの呼び出し
↓ 
cd /hoge/htdocs/msearch↓   #ディレクトリの移動
↓ 
./genindex.pl <&ltHERE↓    #実行ファイルの呼び出し
msearch↓                   #インデックスの名前defaultやdiaryなど可
../↓                       #インデックス対象ディレクトリ
http://www.foo.co.jp/~bar↓ #インデックス対象ディレクトリのURL
.html,.htm,.shtml↓         #インデックス対象ファイルの拡張子
cgi-bin,secret↓            #非インデックス対象ディレクトリ
secretfile.html↓           #非インデックス対象ファイル
検索,私↓                   #非インデックス対象キーワード
1↓                         #ランキング方法
1↓                         #alt属性の文字をインデックスに含むか
HERE↓
いわゆるHEREドキュメントで出来た応答ファイルだと思えば良いようです。msearchのFAQではディレクトリの移動までは記述がありませんが、僕のサーバーでは記述しないと動きませんでした。

で、このスクリプトがちゃんと動いてindexを作ってくれるかどうかSSHでログインして試してみます。

%cd /hoge/htdocs/msearch
./autogenindex.sh

これでmsearch.idxというファイルが出来上がれば成功です。

tDiary用に別のインデックスを作りたいときは、
#!/bin/sh↓
↓ 
cd /hoge/htdocs/msearch↓
↓ 
./genindex.pl <&ltHERE↓
tdiary↓
../tdiary/html/↓
http://www.foo.co.jp/~bar/tdiary/html↓
.*↓


検索,私↓
1↓
1↓
HERE↓
などという内容で、tdiaryindex.shなどとしておけば後はcronで実行するだけです。

'''つづく'''