Movable Typeのテキスト検索を部分一致から完全一致に変更する方法
Movable Typeのテキスト検索を部分一致から完全一致に変更する方法を紹介します。
1.問題点
Movable Typeのデフォルトで用意されているテキスト検索は、検索で指定した文字列が検索対象のフィールド(タイトル・本文など)に含まれていれば、その記事が検索結果として表示されます。
つまり部分一致であればヒットする訳ですが、これを完全一致検索にする方法が不明です。
2.完全一致検索にする
完全一致検索に変更する前の事前知識として、まずテキスト検索の定義はMT::App::Search::core_parameters(ファイルはlib/MT/App/Search.pm)で行われています(下)。
sub core_parameters {
my $app = shift;
my $core = {
params => [
qw( searchTerms search count limit startIndex offset
category author )
],
types => {
entry => {
columns => {
title => 'like',
keywords => 'like',
text => 'like',
text_more => 'like'
},
'sort' => 'authored_on',
terms => {
status => 2, #MT::Entry::RELEASE()
class => $app->param('archive_type') ? 'entry' : '*',
},
filter_types => {
author => \&_join_author,
category => \&_join_category,
},
},
},
cache_driver => { 'package' => 'MT::Cache::Negotiate', },
};
my @filters = ( $app->param('filter'), $app->param('filter_on') );
if (@filters) {
$core->{types}->{entry}->{columns}
= { map { $_ => 'like' } @filters };
}
$core;
}
検索でターゲットとなるオブジェクトとフィールドは以下の部分で定義されています。
types => {
entry => {
columns => {
title => 'like',
keywords => 'like',
text => 'like',
text_more => 'like'
},
上記の設定では「entry」でブログ記事、「columns」でタイトル・キーワード・本文・追記を検索対象にしていることがわかります。
話がそれますが、検索対象の追加・変更・削除を行いたい場合はこの部分を修正すればいい訳で、拙著「Movable Type 5プロフェッショナルガイド」でも解説しています。
本題です。
部分一致の定義は、各フィールド名のハッシュ値にある「like」で定義しています。
title => 'like',
keywords => 'like',
text => 'like',
text_more => 'like'
テキスト検索を完全一致に変更するには、この「like」を「1」に変更します。
たとえば、タイトルとキーワードを完全一致に変更するには次のようにします。
title => '1',
keywords => '1',
text => 'like',
text_more => 'like'
3.プラグイン化する
2項の方法ではプログラムに直接手を入れることになるので、アップグレードを行うたびに修正を行う必要があり、保守性がよくありません。
ということで、プラグイン化する手順も紹介します。
タイトルとキーワードを完全一致に変更するプラグインは、次のようなconfig.yamlを作成するだけです。
id: SearchConditionChanger
name: SearchConditionChanger
applications:
new_search:
default:
types:
entry:
columns:
title: 1
keywords: 1
このファイルをplugins配下にSearchConditionChangerというフォルダを作り、その配下にアップロードすればOKです。
「new_search」はアプリケーションID、「default」はテキスト検索のデフォルト定義を示しているようで、いずれも固定文字列です。
そして最下層の「title: 1」や「keywords: 1」でデフォルトの定義を上書きします。
以下のリンクからサンプルをダウンロードできるようにしておきます。
4.参考サイト
参考サイトは以下です(本エントリーの内容とは密接な関連なし)。
- Movable Typeで特定のブログを検索対象外にする「SearchDisablerプラグイン」
- Movable Typeに検索フォームに任意の検索条件をつける「SearchConditionAppenderプラグイン」