Hyper Estraier 導入

 Movable Type の全文検索(MT::App::Search)がどうしても重かったので代替方法をいろいろ探してみました。
 ajax をつかった全文検索も試してみたのですが、仕事でたまたまサイト検索の調査をしているときにテストしてみた Hyper Estraier の動作がとても軽快だったので採用することにしました。

 Search with Hyper Estraier: a full-text search system for communities - greenplastic.net

 まずは Hyper Estraier のインストール。ボクの場合はサーバーが FreeBSD なので ports から入れました(他の方はオフィシャルサイトの通りにどうぞ)。

portinstall converters/libiconv
portinstall databases/qdbm -m "WITH_ZLIB=yes"
portinstall textproc/hyperestraier

 次に MT から検索用のファイルを書き出すようにテンプレートを追加します。純粋にエントリー本文のみの検索にしたかったのと、それから仕事の調査もかねて Hyper Estraier の独自のデータ形式である文章ドラフトという形式を試してみたかったからです。
 すでに公開してるエントリーアーカイブとは別に、検索用に書き出すファイルのディレクトリの指定とテンプレートの追加を行い、書き出したそのファイル群を Hyper Estraier に読み込ませればいっちょ上がりです。
 簡単でしょ?

 MT の公開の設定で『アーカイブ・マッピング』を追加し、検索用のエントリーアーカイブを書き出すようにします。出力フォーマットを既存のエントリーアーカイブと別ディレクトリに指定したらテンプレートの追加。

 検索用エントリーアーカイブ(Hyper Estraier の『文章ドラフト』フォーマット用)

@uri=<MTBlogURL><$MTEntryDate format="%Y/%m/%d_%H%M"$>.php
@title=<$MTEntryTitle$>
@author=<$MTEntryAuthor$>
@cdate=<$MTEntryDate format="%Y-%m-%dT%H:%M:%S+09:00"$>
@mdate=<$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S+09:00"$>
<MTEntryIfTagged>category=<MTEntryTags glue=","><$MTTagName$></MTEntryTags></MTEntryIfTagged>

<$MTEntryBody remove_html="1">
<MTIfNonEmpty tag="EntryMore"><$MTEntryMore remove_html="1"$></MTIfNonEmpty>
    <$MTEntryTitle$>

 @uri= のあとは、実際のエントリーアーカイブの URL に合うように書き換えてください。グリプラの場合は上記のようになっていますというサンプルです。
 あとはこちらの手順に従ってインデックスの作成、検索用 CGI スクリプトの設置を行います。
 検索ディレクトリが /PATH/TO/search、先ほど MT がファイルを書き出したディレクトリが /PATH/TO/search/entries、検索用のインデックスファイルを作成するディレクトリを /PATH/TO/search/casket とすると、下記のような手順になります。

インデックスの作成(作業はすべて /PATH/TO/search ディレクトリで行うものとする)
# estcmd gather -il ja casket entries

検索用 CGI スクリプトの設置
# cp /usr/local/libexec/estseek.cgi .
# cp /usr/local/share/hyperestraier/estseek.* .

 あとは estseek.conf ファイルの編集ですが、最低でも次の2点の編集が必要です。環境に合わせて書き換えてください。

indexname: /PATH/TO/search/casket
replace: file:///PATH/TO/WWW/{{!}}http://www.greenplastic.net/

 これで、estseek.cgi に実行権限を与えたあとブラウザでアクセスすると検索が行えます。あとは定期的にインデックスを更新したり最適化したりすれば OK ですね。テンプレートが estseek.cgi と同じディレクトリにあるので(estseek.conf)、ブログのデザインと馴染ませることも簡単にできます。
 見た目の体裁が整ったので公開しました。みなさま、ガシガシ検索してくださいませ。会社の同僚たちは、ボクがビールについて何エントリー書いたか調べてはボクを揶揄してきます。

 残りの課題としては、エントリー投稿・編集と Hyper Estraier のインデックスの更新の連携をどうするかです。MT の再構築後に処理を行うプラグインを書けば出来ると思うのですが、cron を回しておけばいいやという気もしています。

 検索は男のロマン!? (Junnama Online (Mirror)) のコメント欄での指摘を本文に反映させました。具体的には、検索用エントリーアーカイブに @mdate (文章の最終更新日時を示す)を指定しているのにもかかわらず、それらを Hyper Estraier のデータベースに追加する際に -sd オプションを使用してしまっていました。-sd を付けるとファイルの更新日時を文書の属性として追加しますので、@mdate に書かれているエントリーの最終更新日時が反映されていなかったことになるようです。
 MT4 な方は EstCrawler を利用するのが良いかも知れません。ボクも利用したいです。

comments powered by Disqus