検索? タグ? カテゴリー? 関連性, 体系付け。

| コメント(4) | トラックバック(0)

まだやってるし...もうちょっと続くかもしれないけど、皆さんもう飽きました?

ブログ内検索




  

実は検索だけじゃないのだ

ブログにおけるエントリーの関連性や体系付けを行うしくみとして、カテゴリーやタグというものがある。一方、読者が欲しい情報を探す一つの手段として「検索」がある。

カテゴリーもタグも発信者の主観で付けられるものだ。ソーシャルブックマーク等のタグはそうではないけれども。

高速なタグ・アーカイブが欲しい

発信者が主観で付けられるものゆえ、検索語の選択が無限であるのに対してカテゴリーやタグは有限だ。であるならばこれらのアーカイブは静的アーカイブにすることが可能で、MTのカテゴリーアーカイブが静的生成できるのは良いとして、タグ・アーカイブも静的生成できるのが望ましいのではないかと思う。

できないのか? と思ってググってみると、同じようなことを考えて既に行っている方がいらっしゃるわけですね(静的生成ではないけど)...

現在作成中のダイナミックパブリッシングを利用した検索ページではタグ検索ができるようになっている。MT4のデフォルトテンプレートでは、タグ検索はmt-searchに渡される動的ページだから、mt-searchが高速動作できる環境でないと遅い(その仕組み上キーワード検索程遅くはないが)。また、CGIによって動的生成されるページへのリンクには nofollowを付けたいところ。でないとGooglebotが (に限らずロボットが) mt-searchを叩くのだ。MTインストール済みレンタルサーバーとかで、ロボットが多くのmt-search を叩いている状況ってのは何だか恐い。ただでさえスパマーがtrackbackやcommentのCGIを叩きまくっているのだし。

モジュール版PHPで動作しているサーバーの場合、CGI(Not FastCGI)の起動よりも早くレスポンスを返せるからこの(PHP)ダイナミック版タグ検索は一つの選択肢になると思う。但し、MTのダイナミックパブリッシングではパラメータ付きのページをキャッシュしてくれない。ここが何とかなるといんだけど。もう少しダイナミック版のソースを追いかけてみよう。

さすがにキーワード検索は動的生成じゃないと、ってかそれでいいと思うし

話がそれた。一方「検索」は発信者ではなく読者が自由に設定するものだ。一部の読者は発信者の意図しないカテゴリの情報を求めているかもしれない。なので基本的に動的生成で良い。問題はMTのデフォルトテンプレートで「検索結果」フィードへのリンクが表示される点だ。確かに検索結果のフィードがとれるってのは便利かと思う。

それでもやっぱり読者がRSSリーダーに mt-search が生成する動的ページのフィードを登録するってのもやっぱり勇気がいるなぁ (サーバーへの負担という点で)。パワーに余裕の無いサーバーではRSSリーダーが取得に失敗するってことも多いのではないだろうか。

ということで、高速・軽量な検索ってのは単なる検索ではなくて、タグ・アーカイブや検索結果のフィード配信の代替プログラムでもあり、カテゴリ+タグでの絞り込みとか、カテゴリ+キーワードの絞り込みとかを実現するためのものなのです。 キーワードはともかく、このあたりを柔軟に指定できて且つ静的に吐き出すことができれば、関連性, 体系付けの選択肢も広がるのではないかな?

分かち書き+MySQL FULLTEXTインデックス検索 VS LIKE検索

両方とも実装してみたのだが、400エントリー弱(実際にはテスト用ブログ等でDBにはその倍くらいが登録されている)のこのブログで、現状のサーバーでは2倍程度の差が出ている。とはいえ20件表示であれば0.08秒前後と0.16秒前後、体感速度に大して差はない。

フィードの生成はもっと高速。各々約半分くらいの時間で検索と構築が終わる。これは検索結果ページではトータルヒット件数を取得してページ送りを実現するためにSQLを2回発行しているからだ(まず全てのヒット件数をカウントしてからoffset, limitを指定して表示すべきエントリーを得ている)。フィードではページ送りが不要だからこの分のSQLが不要。

FULLTEXTインデックス検索には速度以外にもメリットがあって、関連性の高い順に表示することができることだ。また、インデックス作成の際に画像のALTを展開した上でHTMLタグを削除しているから、「タグの中」がひっかからない。
LIKE検索ではたとえば「HTML」について書かれたエントリーを検索したい場合に、アンカータグの中の foo.html とかにもマッチしてしまう。

逆にこれを逆手に取れば、特定のエントリーにリンクしているエントリーの検索とかにはLIKE検索使えるね。例えば、「音声ブラウザと相性の良いHTMLを作る(1)。」にリンクしているエントリーはページのパスをクエリーとして指定してやれば良いわけだ。

ということでね、色々活用法が考えられて 夢がひろがりんぐ でしょ?

トラックバック(0)

トラックバックURL: http://junnama.alfasado.net/cgi/mt/mt-tb.cgi/162

コメント(4)

もう飽きたじゃなくて、どうも話がよく見えないですね。

というのも、CGIのオーバーヘッドが大きいのなら、PHPでmt-search.cgiを実装し直せばいいよどうせ実装し直すのだから自分の好きな機能を好きなだけ盛り込めばいいよというのはその通りなのですが、その話とダイナミックパブリッシングの話は直交しているように思えるからです。

直感的には、mtsearch.phpを実装するのに何かテンプレートエンジンが欲しい、だからMT付属のmtview.phpのバックエンドのテンプレートエンジンを流用するよ、ということなのかなと思うのですが、

>MTのダイナミックパブリッシングではパラメータ付きのページをキャッシュしてくれない。

とか書いてあってどうも違うらしい。

普通に考えてパラメータのパーズも解釈もキャッシュも「検索アプリ」の責任ですよね。それを無理矢理「ビューアーアプリ」で実現しようとしているように見えます。

>直感的には、mtsearch.phpを実装するのに何かテンプレートエンジンが欲しい、だからMT付属のmtview.phpのバックエンドのテンプレートエンジンを流用するよ、ということなのかなと思うのですが、

普通にそういうことです。

>>MTのダイナミックパブリッシングではパラメータ付きのページをキャッシュしてくれない。

>とか書いてあってどうも違うらしい。

どこでキャッシュの生成が定義されてるか見てみようってことを書いたまでで、今確認すると Smartyのようですね。だから、Smartyでは複数のキャッシュが持てるようなので、これを使うという方向に進もうとするわけですが、どこかおかしいですかね?

>普通に考えてパラメータのパーズも解釈もキャッシュも「検索アプリ」の責任ですよね。そ>れを無理矢理「ビューアーアプリ」で実現しようとしているように見えます。

パラメータのパーズも解釈もキャッシュも「検索アプリ」の責任ですが (実際キャッシュ以外のコードは普通にPHPで書いてますし)、「PHP Dynamic Publishing Architecture」を利用して作ろうという話であって「無理矢理「ビューアーアプリ」で実現」とか思いませんが。実際キャッシュの実装は Smartyの話であって、mtview.phpは関係ないわけですし。

>MTのダイナミックパブリッシングではパラメータ付きのページをキャッシュしてくれない。

この表現 (MT云々) がおかしい、と言う話ならその通りです。なので、

>ここが何とかなるといんだけど。もう少しダイナミック版のソースを追いかけてみよう。

と続いていて、『Smartyのキャッシュのしくみを利用して、少なくとも「タグ」検索はキャッシュできるようにしよう』とさらに続くのですが。

それならば納得です。細かいことを言えば、キャッシュの実装はSmartyのものを使わないというオプションもあり得ますけど意味ないですもんね。

>だから、Smartyでは複数のキャッシュが持てるようなので、

と書きましたが、MTの場合元々phpファイルは一つで mod_rerwite で振り分けてますから複数のキャッシュは既に使ってますね。

MT3.34 / mt.php

382: $cache_id = $blog_id.';'.$fi_path;
383: if (!$ctx->is_cached('mt:'.$tpl_id, $cache_id)) {
...

↑この辺に手を入れられたら楽っちゃ楽ですが。
今見ているのは3.34のソースですが、Perlバージョンと比べると、処理のフックというかコールバックなんかが殆ど無いです。mt.php の &view の各所にプラグインで割り込み出来るといいなぁと思います。build_file_filter に相当するものがあれば一発なんでしょうが。

Six Apart ProNet Articles - Dynamic Publishing: PHP Architecture Overview
http://www.sixapart.com/pronet/articles/dynamic_publish.html

ここの「Customizing mtview.php」にあるような方法で関数ごと置き換える方法はありますね。

コメントする

Facebook

Twitter

このブログ記事について

このページは、Junnama Nodaが2007年10月10日 16:04に書いたブログ記事です。

ひとつ前のブログ記事は「MT TemplateSelector プラグイン(バグFix版 & ダイナミックパブリッシング対応版)。」です。

次のブログ記事は「プレビュー時に生成される一時ファイルを削除するプラググイン(MT4専用)。」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.2.6