以前のエントリー「mt-search.cgiの代替プログラム。」で書いたように、mt-search.cgiは速度面や負荷に難があるので代替プログラムを書いてみた。ずいぶんマシになったとは思うがまだまだ遅い。
ということで MovableType にHyper Estraierの「文書ドラフト」を出力するテンプレートを追加してそれに対してインデックス作成→検索を行い、精度が高く高速な検索を実現できたのでメモ。
ポイントは「文書ドラフト」をエントリーアーカイブのHTMLとは別に生成すること。
生成されたHTMLをそのまま検索すると、ナビゲーション等の不要な「ゴミ」を検索にひっかけてしまい、検索精度が下がる。「文書ドラフト」に必要な情報のみを出力することで検索精度をあげることができる。
まず、Hyper Estraierをインストール。
MovableTypeに以下のようなエントリーアーカイブのテンプレートを追加する。
@uri=<$MTEntryPermalink$> @title=<$MTEntryTitle remove_html="1"$> @cdate=<$MTEntryDate format="%Y-%m-%dT%H:%M:%S"$>+09:00 @mdate=<$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$>+09:00 category=<$MTEntryCategory$> categoryUrl=<$MTEntryLink archive_type="Category"$> <$MTEntryTitle remove_html="1"$> <$MTEntryBody remove_html="1"$> <$MTEntryMore remove_html="1"$> <$MTEntryKeywords remove_html="1"$>
※この場合画像のAlt属性等が検索出来ないので、そのあたりは別途プラグインを書く予定。
「設定」→「公開」→「アーカイブ・マッピング」→「マッピングを新規作成」
テンプレート:「エントリーアーカイブ」を選択
draft/%y_%m_%b.est
とする。
再構築後、文書ドラフトが生成されたdraftフォルダに対してインデックスを作成する。
estcmd gather -il ja-sdcasket /home/junnama/public_html/online/draft
あとはestseek.cgiを使っても良いし「言語バインディング」が公開されているのでオリジナルのプログラムを作成することも可能。
今回はPHPからestcmdをshell_execで叩いてxmlで結果を受取ってからそいつを整形して出力するようにした。
あわせてPHPから読み込むテンプレートを「検索用テンプレート」としてこちらもMovableTypeに登録しておくと再構築の際に「最近のエントリー」とかそのあたりが反映されるようになる。

追記:
プラグインを作成。
インデックスの更新を管理画面から行えるようにした。これは便利!
はじめまして こんにちは
「文書ドラフト」件大変参考にさせていただきました
ありがとうございます
そのインデックス更新用プラグインの公開を是非、是非お願いいたします
出来ればエントリー投稿・編集に連動して自動だと大変嬉しかったりします
ttp://mook.jpn.org/archives/2007/02/hyper_estraier_3.html
超適当なんですが、どんなでしょう。。
>こてつさん
コメントどうも、です。
う〜ん、プラグイン書いてエントリ保存時にインデックス更新ってのがスマートだと思うんですが(Perlバインディングでもシェルスクリプト実行でも良いのですが、プラグインからエントリ保存のタイミングで実行する)。
僕が現在書いて使っているのは、再構築画面にインデックスの更新ボタンを付けてインデックス更新するものです。
ただ、まるごと更新ってあんまりスマートじゃないですよね。更新されたエントリだけの差分でインデックス更新するものを書こうかと思っているところでとまってます。
> まるごと更新ってあんまりスマートじゃないですよね。
ですよね。多少力技、強引ぎみですからね。「-cl」と「-sd」と「-cm」オプションで差分登録でとりあえず我慢しているところです。