Fast Search でカテゴリーの絞込み検索をする
先週紹介した「Movable Type で高速検索を実現する Fast Search プラグイン」ではオプションとしてカテゴリーの絞込み検索を行うことができます。
このエントリーでは Fast Search の検索フォームにカテゴリー選択のプルダウンメニューを追加する方法をご紹介します。
プラグイン配布元ではカテゴリーで絞込みを行う場合は、検索フォームに、
<input type="hidden" name="category" value="5" />
というような input 属性を追加する説明がありますが、カテゴリー ID はプルダウンメニューから設定できるようにします。
1.デフォルトテンプレートの場合
リストの青色部分が Fast Search の検索フォームに追加した箇所です。
<div class="module-search module">
<h2 class="module-header">検索</h2>
<div class="module-content">
<form method="get" action="<$MTBlogURL$><$MTFastSearchScript>">
<input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" />
<label for="search" accesskey="4">ブログを検索: </label><br />
<input id="query" name="query" size="20" />
<select name="category">
<option value="0">全カテゴリーを検索</option>
<MTCategories>
<option value="<$MTCategoryID$>"><MTParentCategories glue=" > "><$MTCategoryLabel$></MTParentCategories></option>
</MTCategories>
</select>
<input type="submit" value="検索" />
</form>
</div>
</div>
2.公開テンプレートの場合
<div class="side">
<form method="get" action="<$MTBlogURL$><$MTFastSearchScript>">
<input type="hidden" name="IncludeBlogs" value="<$MTBlogID$>" />
<label for="search" accesskey="4">ブログを検索: </label><br />
<input id="query" tabindex="5" accesskey="t" name="query" size="20" value="" /><br />
<select name="category">
<option value="0">全カテゴリーを検索</option>
<MTCategories>
<option value="<$MTCategoryID$>"><MTParentCategories glue=" > "><$MTCategoryLabel$></MTParentCategories></option>
</MTCategories>
</select>
<input type="submit" tabindex="6" accesskey="s" value="Search" />
</form>
</div>
3.注意事項
サンプルで追加したプルダウンメニューは、サブカテゴリーの左側に、">" をセパレータとして親カテゴリーを表示していますが、現実的にはカテゴリー名全体が横に長くなる場合が少なくないと思われます。横に長くなり過ぎると、プルダウンメニューがサイドメニューからはみ出す可能性があります。
カテゴリー名がはみ出さないようにするには、サブカテゴリーのみ表示するように、
<option value="<$MTCategoryID$>"><MTParentCategories glue=" > "><$MTCategoryLabel$></MTParentCategories></option>
の部分を
<option value="<$MTCategoryID$>"><$MTCategoryLabel$></option>
に変更してください。
Movable Type で高速検索を実現する Fast Search プラグイン
ダイナミック・パブリッシングを利用して Movable Type の高速検索を実現する Fast Search プラグインを紹介します。
このプラグインは、3.2x および 3.3x の検索結果テンプレートで利用している MT タグを php で利用可能にしたもので、テキスト検索、3.3x ではタグ検索も可能になっています。実験した感想としては検索レスポンスが数倍向上します。
なおプラグイン適用条件として、下記を満たしている必要があります。
- Movable Type 3.2 or 3.3
- MySQL 4.0.1 以上
1.プラグインのダウンロード
下記のサイトにある「Dowmload Now」のリンクをクリックして、プラグインをダウンロード。非商用サイトは無償で寄付を受け付けています。商用サイトは $97.00 です。
2.プラグインのアップロード
まず解凍した時のディレクトリ構造は下の通りです。
/FastSearch
/php
/plugins
block.MTBlogResultFooter.php
:
modifier.google_highlight.php
/plugins
/FastSearch
/tmpl
fast_search.tmpl
widget_fast_search.tmpl
FastSearch.pl
/PluginNetwork
PluginNetwork.pl
これを次の通りにアップロードします。
- FastSearch/php/plugins 配下のファイルをインストールディレクトリの mt-dir/php/plugins に全てアップロード
- FastSearch/plugins をインストールディレクトリの mt-dir/plugins にフォルダごと全てアップロード。mt/plugins の下に FastSearch および PluginNetwork ディレクトリが配置されるようにしてください。
3.アップグレード
プラグインをアップロード後、管理ページにログインするとアップグレード画面が表示されます。
驚かずに粛々と作業を進めてください。
アップグレード完了後、管理ページに再度ログインします。
4.ダイナミックパブリッシングの設定
Fast Search プラグインを利用にするために、ダイナミックパブリッシングの設定を行います。ダイナミックパブリッシングをご利用でない(各ページをスタティックに出力している場合)、メインページや他のアーカイブページをダイナミックパブリッシングに変更する必要はありません。
ブログ別管理画面の[設定] - [公開]を選択し、「再構築オプション」を「テンプレート別に、スタティックHTMLもしくはダイナミック・パブリッシングを選択します」を選択します。これで「変更を保存」をクリックします。
この時、メインページのあるディレクトリにダイナミックパブリッシングを有効にするための .htaccess および templates_c ディレクトリが自動生成されます。
5.Fast Search 設定1(初期設定)
ブログ別管理画面の[設定] - [プラグイン]を選択し、一覧に表示されている「Fast Search」の右側にある「設定を表示」をクリックします。これで設定画面(下)が開きます。
まず「Enable Fast Search」をチェックしてプラグインを有効にしてください。
「Search Results Per Page」および「Enable Logging」の設定もこの時に同時に設定することができます。
設定後、「変更を保存」をクリックします。
6.Fast Search 設定2(検索結果表示用テンプレート生成)
再度、 プラグイン一覧に表示されている「Fast Search」の右側にある「設定を表示」をクリックします。そして「Click here to install the default Fast Search Template.」のリンクをクリックしてください。
これで Fast Search 検索結果表示用の特殊なインデックステンプレートが生成され、その画面に遷移します(すでに保存されているので「保存」をクリックする必要はありません)。
また前段の作業でダイナミックパブリッシングの設定をしているので、再構築オプション自動的に「このテンプレートをダイナミック・ページにする」にチェックがつきます。もし後からダイナミックパブリッシングの設定を行なった場合は、このテンプレートに対しダイナミックパブリッシングで動作する設定(=チェックボックスのチェック)を行なってください。
これがプラグインで用意されている検索結果画面テンプレートですが、3.3x の検索結果画面デフォルトテンプレート、あるいは当サイトで配布している検索結果画面テンプレートに丸ごと入れ替えても正常に動作します。
7.Fast Search 設定3(検索フォーム)
Fast Search 用のフォームは、既存の
<form method="post" action="<$MTCGIPath$><$MTSearchScript$>"
を
<form method="post" action="<$MTBlogURL><$MTFastSearchScript>"
に変更すればOKです。
またはプラグインから Widget を生成することもできます。その場合は先のプラグイン設定画面にある、「Click here to install the Fast Search Widget.」のリンクをクリックします。これでテンプレートモジュールとしての検索フォーム「Widget: Fast Search」が生成されます。

このテンプレートモジュールを Widget ではなく、MTInclude タグで引き込むこともできます。その場合は検索フォームを表示させたいテンプレートのサイドバー部分に下記の1行を追加します。
<$MTInclude module="Widget: Fast Search"$>
8.Fast Search 設定4(FastSearch Method)
プラグインの設定画面で、もうひとつ「FastSearch Method」というプルダウンメニューの選択による設定項目があり、それぞれ下記のような意味があります。
- FullText:MySQLに標準搭載されている全文検索インデックス
- Non-FullText:上記以外
- Fallback:FullText を試行し、NGであれば Non-FullText で実行
FullText が一番良さそうなのですが、環境によってはエラーが発生します(実験サイトで試したところ、正常に動作する時とそうでない時がありました)。
調べてみたところ、FullText での日本語の全文検索については制約があるようです(詳細は9項の関連記事参照)。また Fallback では FullText を試みますが、失敗した場合は FullText のエラーが画面に表示されてしまうので、FullText を選択してエラーが解消しない場合は Non-FullText を選択するのが無難でしょう(FullText の適切な設定方法があればご教示ください)。
これで Fast Search の検索フォームより検索を実行し、検索結果が正常に表示されれば完了です。
9.ダイナミック・パブリッシングのチューニング
これで検索処理は高速になりますが、Movable Type デフォルトの検索機能の「連続実行抑止時間」の設定はありません。その結果サーバへの負荷拡大が予想されます。モジュール版PHPであればまだ良いのですがCGI版PHPの場合はプログラム実行とみなされます(参考:PHP における「モジュール版」と「CGI 版」の比較 + WordPress の適用例)。
したがって、「Movable Type の再構築を不要にする「ダイナミック・パブリッシング」(その2:設定方法)」の3項で解説しているように、ページレベルのキャッシングや条件付きGETの設定し、サーバの負荷を少しでも軽減することをお勧めします。
なおタグ検索は有効と思われますが、テキスト検索では検索文字列が不定なため、どれほどの効果があるかは分かりません。
10.関連記事
- 亜細亜ノ蛾 - Weblog:MT の高速検索プラグイン「Fast Search」
- たたみラボ:MySQLで全文検索 - FULLTEXTインデックスの基礎知識
- Movable Type 3.3 マニュアル:ダイナミック・パブリッシング

