TopMovable Typeプラグイン検索 > 2014年1月
2014年1月28日

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

January 28,2014 12:55 AM
Tag:[, , ]
Permalink

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
Comments [0] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3