Movable Typeのテキスト検索を部分一致から完全一致に変更する方法

Movable Typeのテキスト検索を部分一致から完全一致に変更する方法

Posted at January 28,2014 12:55 AM
Tag:[MovableType, Plugin, Search]

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」でデフォルトの定義を上書きします。

以下のリンクからサンプルをダウンロードできるようにしておきます。

SearchConditionChanger_0.01.zip

4.参考サイト

参考サイトは以下です(本エントリーの内容とは密接な関連なし)。

Lucene::QueryParser - search.cpan.org
関連記事
トラックバックURL


コメントする
greeting

*必須

*必須(非表示)


ご質問のコメントの回答については、内容あるいは多忙の場合、1週間以上かかる場合があります。また、すべてのご質問にはお答えできない可能性があります。予めご了承ください。

太字イタリックアンダーラインハイパーリンク引用
[サインインしない場合はここにCAPTCHAを表示します]

コメント投稿後にScript Errorや500エラーが表示された場合は、すぐに再送信せず、ブラウザの「戻る」ボタンで一旦エントリーのページに戻り(プレビュー画面で投稿した場合は、投稿内容をマウスコピーしてからエントリーのページに戻り)、ブラウザをリロードして投稿コメントが反映されていることを確認してください。

コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。例えば「<$MTBlogURL$>」は「&lt;$MTBlogURL$&gt;」となります(全て半角文字)