以前から暴想さんで公開されている Ajax を使用した Blog 向けサイト内検索を社内的なサイトで使わせて頂いたのでお礼を兼ねて紹介。実際にベースにしたのは暴想さんのスクリプトを元に Movable Type 向けにカスタマイズされた Dakiny さんバージョン。
そいつをさらにカスタマイズさせてもらって使用しましたが、そのバージョンを折角ですので公開してみようと思います。
今回使わせていただいた blog_ajax_json_search.js は、エントリーのタイトルや本文、コメント (コメントも検索対象にしたは風柳亭さんによるカスタマイズ) を全部 JSON で書き出しておいて、そいつを JavaScript で検索する仕組みなので、とにかく検索が早い。かなり便利なスクリプトです。もちろんそのままでも十分使えるのですが、個人的に気になった点とかをカスタマイズしています。
とりあえず、必要なファイル一式は下記においてあります。
当サイトのエントリーデータを使用したサンプルが下記で試せます。
それでは解説を。
ダウンロードしたファイルを解凍すると、下記のようなファイルが含まれています。
- Ajax_search_form.txt
- head_js.txt
- search_data.txt
- index.html
- js/
- blog_ajax_json_search.js
- prototype.js
- css/
- sample.css
- img/
- icon_arrow.gif
- loader.gif
まずはフォルダからですが、js、img の両フォルダは、そのままアップロードしてください。ドメイン直下に置かれることを想定していますので、パスが変わる場合は、何ヶ所か変更しなければならない場所が出てきますのでご注意を。
ちなみに、blog_ajax_json_search.js の文字コードが 「utf-8」 なので、Blog の文字コードがそれ以外の場合は、一度文字コードを変更して保存しなおしてください。
それから、css フォルダ内のスタイルシートは、今回のサンプルで使用しているスタイルなので、参考までに。動作に関係はありません。
次にファイルです。index.html はサンプルの XHTML ソースなので、これも参考まで。重要なのは下記です。
- Ajax_search_form.txt
- head_js.txt
- search_data.txt
Ajax_search_form.txt は検索フォーム周りのソース。MT テンプレートタグが仕込んでありますので、そのままお使いのテンプレートに入れ込んで再構築してもらえれば大丈夫かと。
head_js.txt は JavaScript ファイルをヘッダで読み込むための記述。これも MT エントリータグが入っていますので、お使いのテンプレートの <head> ~ </head> 内にコピペしてもらえれば OK。
search_data.txt は検索用のデータを書き出すテンプレートのソースです。これで書き出されたデータが検索の具ってことになります。
MT 上で新規インデックステンプレートの作成に進み、このソースをコピペ。出力ファイル名に 「search_data.txt」 を指定して保存、再構築してください。それから再構築の設定は、インデックス・テンプレートの再構築時に、このテンプレートも自動的に再構築されるようにしておいてください。
今回は Blog の URI 直下にこのファイルが書き出されていることを想定しています。ちなみにテンプレート内の <MTEntries lastn="0"> って記述は間違いじゃなく、lastn="0" にしておくと全エントリーが書き出されるからです。
最後に、お使いのテンプレート内で、検索結果を表示したい部分に
<div class="result"></div>
という記述を追加してください。div 要素内は空でも、既存のソースを囲む形でも大丈夫。検索結果表示の際にはこれで囲まれた部分が結果表示と置き換わります。
これで、動作すると思います。うまく動かない場合はファイルのパスとか調べてみてください。
最後に私が変更した点を下記にまとめておきます。
blog_ajax_json_search.js 内の変更点
- 検索中の表示をちょこっと改良して、ロード中画像が出るようにした。
- 検索キーワードが未入力の場合はエラーを返すように変更。 (オリジナルは全エントリーを返しますが、エントリー数が多い場合にかなり重たいので)
- 検索キーワード、ハイライト部分のマークアップを <span class="keywords"> ~ </span> に変更。(オリジナルはstyle 属性による直指定)
- 検索結果の出力ソースをごっそり変更。(出力されるソースは後述)
- 検索フォームの小細工 (初期テキストがフォーカスで消えるやつ) 用のソースをお尻に追加。
合わせてフォーム部分のソースもかなりいじってますので、ベースにさせていただいたソースとは違っています。
で、検索結果で出力されているソースが下記。スタイル当てる際の参考にどうぞ。
<div class="section"> <h2>「検索キーワード」の検索結果(○ 件)</h2> <dl> <dt> <a href="エントリーURI" title="エントリータイトル">エントリータイトル</a> </dt> <dd>本文、追記、コメントから検索キーワードに該当した部分</dd> </dl> </div> <p class="search_back"> <a href="javascript:void(0);" title="元のページに戻る" onclick="location.reload(true); return false;" onkeypress="location.reload(true); return false;">元のページに戻る</a> </p>
検索結果が 0件だったときは下記のソース。
<div class="section"> <h2>「検索キーワード」の検索結果(0 件)</h2> <p>該当するエントリーはありませんでした。</p> </div> <p class="search_back"> <a href="javascript:void(0);" title="元のページに戻る" onclick="location.reload(true); return false;" onkeypress="location.reload(true); return false;">元のページに戻る</a> </p>
キーワードが入力されていない場合は下記。
<div class="section"> <h2>検索キーワード未入力</h2> <p>検索キーワードが入力されていません。キーワードを指定してください。</p> </div> <p class="search_back"> <a href="javascript:void(0);" title="元のページに戻る" onclick="location.reload(true); return false;" onkeypress="location.reload(true); return false;">元のページに戻る</a> </p>
ちなみに、スクリプトのライセンスがスクリプトファイル内の頭に記述されていますので、再配布やらする方は必ず確認してください。





![[広告] EIZO 地デジ対応ターミナルモニター](http://direct.eizo.co.jp/docs/link/Netmile_080422.gif)
はじめまして。このページを参考にしてブログ内検索ができました。
ごっそり変えられた、というあたりが素晴らしくて感服しています。
おたずねしてみるのですが、
複数ブログでサイトを構成している場合に、各ブログをまたいで検索させることもできないでしょうか?
検索用ページをトップのみに置くなりして、
その下の階層に置いているA、B、C・・・それぞれのブログ全てを対象に検索させるというかたちができるといいなあと思うのですが、もし可能であれば教えていただけると助かります。
羊さんコメントありがとうございます。
最も単純な方法でしたら検索時にデータベースとして使用される「search_data.txt」内に対象にしたいブログのデータが入っていればいいということになりますので、例えばMT4なら「MTBlogs」タグや「MTEntries」タグの「blog_ids」アトリビュートなどを使用して複数のブログのデータがデータベースに入るようにしてあげればいいんじゃないでしょうか。
検索結果をブログごとに表示したいとかなると、スクリプトのカスタマイズが必要になりますが。
ありがとうございます。
「search_data.txt」内に全データが入ればいい、なるほどそうですね。
ただ・・・、当方にそこまでできる知識があるかは分からないのですが、また週末にでもチャレンジしてみようと思います。
すばらしい機能なので、何とか活かしたいです。
取り急ぎ、お礼まで。
羊さん。細かく説明できなくて申し訳ないです。でも全部のブログを対称にするだけなら簡単ですよ。
もしMT4をお使いなら「search_data.txt」テンプレート内の、
<MTEntries lastn="0">
となっているところを
<MTEntries lastn="0" blog_ids="all">
にしてみてください。これだけで全部のブログのデータがDBに入りますので。
ごていねいに早速のフォローをありがとうございます。
ダメなら別ブログにしていたのをカテゴリにやり直そうかと思っていました・・・。
MT4でないのですが、何も考えず、blog_ids="all"を付け加えてダメ・・・。
MT4にアップするしかないのかと思いながら、
・・・と、MT4が複数ブログ対応を強化したらしいことを思い出して、ならば、とMultiBlogにしてみたらできました!
感動です。
最初はblog_ajax_json_search.js 内の修正が必要なのかと思っていたのですが、search_data.txtの方だったのですね。
簡単なことが頭が回らず、よく考えてみるべきでした。
でも、本当にありがとうございました!
ちなみに、こちらのサイトには去年、エントリーされていた秀丸のhtml_selectマクロがきっかけだったのですが、それも大変、ありがたく活用しています。
非常に重宝しており、編集に役立っています。
こんばんは、検索でたどり着きました。Tagcloud でも、可能でしょうか?早速ダウンロードしたので。通常はmt-search.cgiにリンクしますが、これを爆速の検索に利用したいのですが?カスタマイズのカスタマイズで大変ありがたく利用したいと思ってます。
大変助かっています。
prototypeが使えなかったので、jQueryに書き換えてみました。次の2か所です。
# 元の暴想さん版でもこの修正でjQuery版になりました。
81行付近
} else {
/* prototype版
new Ajax.Request( archive_file_path, {method: 'get', onComplete: function(request){ parse_archive_data( request ); } } );
*/
// jQuery版に書き換え
$.ajax({ url : archive_file_path, type : "get", data : text, success: function(request) {request );
parse_archive_data( request );
}
});
}
104行目付近
// jQuery版
var data_string = request;
//var data_string = request.responseText;