Movable Type 7 で活躍しそうな検索システム「bpSearch」というのを PHP で作ってみました。
これは Movable Type Advent Calendar 2018 の 6 日目の記事です。今年は MTAppjQuery Advent Calendar 2018 もやっているので、なかなか大変です(笑
さて、今回は Movable Type 7 で活躍しそうな PHP の検索システムを作ってみました。これまで bit part で Movable Type で作るサイトに検索システムを組み込む時は、
が多かったのです。特におすすめなのは flexibleSearch.js
を使った高速 JavaScript 検索でした。インデックステンプレートで書き出した JSON ファイルを元に検索するのでとにかく高速に動くのがウリです。
しかし、中規模以上のサイトになると、どうしてもコンテンツ量が増えてきて、JSON を一度ロードするタイプの検索だと、JSON の容量が数メガになってくると、最初のロードに少し時間がかかってしまうという難点がありました。
そこで、今回は、そういった弱点を克服すべく、PHP をベースにした検索システムを作ってみたというわけです。正確に言うと、PHP をベースにした検索は、これまで数件の実案件で実装していましたが、今回はそれを書き直して、より汎用的にした感じです。
今回、この bpSearch.php
を使うためにブログをリニューアルしました(注:2019年6月以降、このブログは Craft CMS を利用していますので bpSearch.php は使っていません)。
例えば下記のページで利用しています。
これらのページでは、Ajax で bpSearch.php
から情報を取得して、Vue.js で表示しています。体感的にも結構速いと思っています。
あらかじめ検索用のファイルを出力しておくというのは、 flexibleSearch.js
と同じですが、今回はキーワード検索用のファイルとフィルター&表示に使う JSON ファイルを二つ書き出します。
この2つのファイルは、それぞれインデックステンプレートで書き出しても良いですが、再構築の負荷を考えて、藤本さんの WriteToFile プラグインを使うと良いです(MT7でも動きます)。
仕組みとしては、キーワード検索がある場合は、PHP から Linux のシステムコマンドを叩いて検索します。該当したものを表示用の JSON と組み合わせて最終的な JSON を返します。
この bpSearch.php
、なんとページ分割の情報も返してくれるので、ページ分割を頑張って実装する必要はありません。
フィルター条件も割りと柔軟に指定できます。like
eq
gt
ge
lt
le
などです。
この bpSearch.php
では、リクエストに cache=1
のパラメータを付けると、そのリクエスト結果をファイルに書き出すので、2回目以降はより高速なレスポンスを期待できます。
キャッシュのクリアは、 cron
で定期的にキャッシュディレクトリのファイルを削除してもいいですが、おすすめなのは、インデックステンプレートに SystemCommand プラグインでキャッシュディレクトリの中身を削除するコマンドを仕込む方法です(MT7でも動きます)。
こうすることで、記事が公開されると、インデックステンプレートの再構築も走るので、そのタイミングでキャッシュを削除してくれます。
Movable Type 7 からコンテンツタイプが導入されたり、MTAppjQuery 2 の mtapp.multiField
が使えるようになったりで、管理画面側では様々は形でデータを扱えるようになりました。しかし、その分、いままでの MT よりもデータベースに入っている情報は複雑になる印象です。
この bpSearch.php
を使えば、テンプレートで決まったフォーマットで、検索させたいデータを書き出せばいいので割りと簡単ですし、あとは bpSearch.php
がよろしくやってくれるので、かなりおすすめだと思います。
bpSearch.php
、実際の案件で使えるレベルになっていると思うので、まだ配布方法とか販売方法とか考えていないのですが、ご興味のあるかたはお気軽にお問い合わせください〜!