![]()
唐突ですがTRASH-NEWSの検索結果がすこし見やすくなりました。これまでは検索で引っかかった記事本文の全文を表示していましたが、このたびGoogleやYahoo!などに準じた表示形式(マッチした検索語の前後数十文字をつなげて表示)に切り替えました。またそれに応じて表示件数も4件から10件に。すっきりしました(ex. 『秋葉原』の検索結果)。
TRASH-NEWSではブログ作成ツールとしてMovableTypeを利用しており、このMovableTypeには標準で検索エンジンが付属しています。MovableType4は検索エンジンが3時代より改善されたようですが、かわりに“謎のエラー(検索失敗)”をしょっちゅう起こすようになりました。どうも検索処理に高い負荷がかかる設計であるようです。10件しか記事がないときから既に“謎のエラー”が起きていましたから、これが1,000件単位の記事になったとき果たしてどうなるか ガクブルがとまりません。こんな虚弱な検索エンジンに重荷など背負わせられない!
そこで検索結果をキャッシュする仕組みに作り替えました。以下PHPのプログラムの話です(MovableType4を前提として書いていますが同様のことはMovableType2/3でも可能です)。MovableTypeの改造に興味のある方はどうぞ。
このカスタマイズに際してはいじる場所が多いのですが、MovableTypeの設定自体はほとんど変更しないのでバージョンアップにも柔軟に対応できるのが強みです(すべてダッシュボードで変更できる範囲内)。またプラグインいらずであるため精神衛生上も安心です。
まず最初のステップは検索語を送信するフォームをmt-search.cgiから切り替えること。formのaction先をsearch.php(自作するプログラム)に書き換える、と書けば話が早いでしょうか。ここでこのsearch.phpの役目は大きく3つ。
つまりsearch.phpはキャッシュを作成・管理・表示させるためのゲートウェイプログラムとして使います。このPHPのプログラムを利用するメリットは検索結果がキャッシュされるためmt-search.cgiへのアクセスが減り検索ミスの心配が少なくなること。一度mt-search.cgiを経由して検索結果を取得すれば一定時間はその検索語に対して検索処理が行われません。MovableType風に言えば『検索結果のダイナミックパブリッシング』ですね。
また検索語や検索結果をPHPで自由にいじれるため、検索ランキングコーナーやページ分割機能(Pager)を簡単に作ることが出来ます。いままでプラグインなどを要したものがPHPの外部ファイルをひとつ置くだけで解決してしまう、それがこのsearch.phpの最大の魅力かもしれません。冒頭の“検索結果の表示件数を調整した/表示形式をGoogleライクにした”というのもこの方法なればこそです。
ここでいったんsearch.phpから離れて、システムテンプレートの『検索結果』をカスタマイズします。このテンプレートを以下のように書き換えます。
<MTSearchResults>
<$MTEntryID$><>
<$MTEntryTitle encode_html="1"$><>
<$MTEntryLink encode_html="1"$><>
<$MTEntryBody encode_html="1" convert_breaks="0"$><>
<$MTEntryDate format="%Y%m%d"$><>
<$MTEntryKeywords encode_html="1"$><>
<MTEntryTags glue="," replace='"',""">
<$MTTagLabel$>
</MTEntryTags>
<EOL>
</MTSearchResults>
上記のようにwebアプリでよく用いられる"<>"セパレート形式で加工用データを吐き出すようにします。つまりhttp://(URL)/mt-search.cgi?IncludeBlogs=1&search=(URL変換した検索語)にfile_get_contentsをかければ上記のような書式の文字列がずらずらと取得できる寸法です。
閑話休題、URLにアクセスしてデータを得るくらいなら直にMovableTypeのデータベースにアクセスしてデータを引っ張ってきたほうが早いじゃないか とは思いますが、今後のアップデートでデータベースの仕様が変わらないともいえませんし、データベースの種類に関わらず利用できる手法ということでこのような手法をとっています。URL取得できるということはAjax展開も出来ますしね(と同時にセキュリティ面を考慮してmt-search.cgiは保護/隠蔽するなどすべき)!
さて本論に戻りますが、取得してきたデータはimplodeで配列に分割し、そのデータを適宜加工した後serialize関数でファイルに保存できるように変換、キャッシュ用のディレクトリに保存します。このあたりの作業はシステムテンプレート側でも出来るので、そこはどちらでも。またここでxml形式で保存するようにすれば使い道がいろいろと増しますね。
ここまでの工程で検索結果のデータをPHPで加工しやすいかたちに整形してキャッシュすることが出来ました。あとはこれを表示するだけなのですが、うまくこなすためにはその解説に多くの文章が割かれそうなので以下次回に続きます。
余談。
MovableType4の最悪な点。一度タイムアウトでログアウトしてから(それに気づかず)記事を投稿すると、不明のエラーが起きて書いていた記事がすべて消えてしまう。ログアウトした時点でご自慢のオートセーブもストップしてしまうのでまったくアテにならない。なぜかウチの環境では15分おきにタイムアウトを起こしてしまうようなので実に良い死活問題。無線LANがブチブチ切れるからだとか、そういった理由なのかしら 。なんにせよ非常にやるせなくなります。
ちなみにOperaのもつ便利機能『戻るボタンを押してもフォームの中身を復帰するよ!』も、iframeの中のフォームまでは復帰不能。iframeをわざわざ好んで使うwebツールなど滅びてしまえ。
というわけでこの記事はパトスをたぎらせた1時間と涙にぬれた30分と涙をぬぐった30分をかけて半ばやっつけ気味に書かれました。そういう防衛線。
2008年09月06日 0時更新
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| « 11月 | - | 01月 » | ||||
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 | |||||
