PSGI環境にて動作するMTでmt-ftsearch.cgiを使ってみた

公開

先日の記事「mt-ftsearch.cgiで検索をちょっといい感じに」の続き。PSGI環境にて動作するこのブログに全文検索を導入しようと思いmt-ftsearch.cgiを動かしてみたのですが、なんと予想外の「Not Found」表示。

ちょっとがっかりしてFacebookに書いたところ、アルファサードの野田さんからPowerCMS ブログの記事をご紹介頂きました。そこで、いくつかの記事を拝見し、Perlを学んだことがないながらもMTのコードを追い始めました。

その結果たどり着いたのが、lib/MT/Core.pmのapplicationsにftsearchを登録することでした。lib/MT/PSGI.pmにMT::Component->registry('applications');のようなコードがあるので、一応正しいのかなと思っています。

'ftsearch' => {
    handler => 'MT::App::Search::FreeText',
    script  => sub { MT->config->SearchScriptFt },
    tags    => sub { MT->app->load_core_tags },
},

これでPSGI環境のMTでもmt-ftsearch.cgiが無事動き始めたのですが、動作検証としてmt-search.cgiを表示させると同一の結果が出る場合があることに気付きました。なんだかキャッシュのようだなと思い再びコードを追い始めると、lib/MT/App/Search.pmにキャッシュに関係しそうなコードを発見。サブルーチンgenerate_cache_keysが怪しいなと思い、Power CMS ブログで学んだData::Dumperのコードを入れてみると、mt-ftsearch.cgiで検索した場合とmt-search.cgiで検索した場合共に、同じキャッシュキーが生成されることが分かりました。

そこで、キャッシュキー生成時に下記のようにスクリプト名を入れると改善されました。

$key = perl_sha1_digest_hex($app->script . $key);

プラグイン化へ

Core.pmとSearch.pmのカスタマイズで意図した結果が得られることが分かったのですが、コアを書き換えているのがイマイチだなと考えました。何か方法はないかと探していると、「Movable Typeのテキスト検索を部分一致から完全一致に変更する方法: 小粋空間」に、Search.pmのカスタマイズをconfig.yamlに落とし込んでプラグイン化する方法が書かれていました。

そこで、次のようにconfig.yamlを書いてプラグイン化し、pluginsディレクトリに格納したところ、Core.pmを元に戻してもmt-ftsearch.cgiが動作しました。

id: UseFtsearchOnPSGI
name: UseFtsearchOnPSGI
key: useftsearchonpsgi
version: 0.1.0
author_link: https://www.anothersky.pw/
author_name: Hideki Abe
description: PSGI環境でmt-ftsearch.cgiを利用可能にする

applications:
    ftsearch:
        handler: 'MT::App::Search::FreeText'
        script: >
            sub { default => 'mt-ftsearch.cgi', }
        tags: >
            sub { MT->app->load_core_tags }

Search.pmのカスタマイズもプラグイン化できないかなと思い、野田さんの記事「MTCSの拡張とか。」を読んで応用しようとしたのですが、上手くいかず...。(プラグインの勉強が必要ですね。)もっとも、mt-ftsearch.cgiとmt-search.cgiの両方で全文検索するわけではないので、ひとまず置いておいてもいいかなと思っています。

これでようやくPSGI環境のMTでも、MySQLのFULLTEXTインデックスを利用して全文検索が行える準備が整いました。週末辺りにテンプレートを整備したいと考えています。