PowerCMS ブログ

2011年03月05日

Enterpriseエディションの全文検索をカスタマイズする

※PowerCMS 3.14 からプラグインなしでカスタマイズ可能になりました。

Power CMS for MTのEnterprise版(Movable Type Advancedにバンドルのものを含む)にはオープンソースの全文検索エンジンHyper EstraierをMovable Typeから扱う検索システム(PowerSearchプラグイン)が含まれています。

Power CMS for MTのすべてのバージョンに含まれるSQL検索(AltSearch)と比較して下記のような特長があります。

  • キーワードに対する文書のマッチング順に検索結果を出力することができます
  • PDF文書やCMSで管理していない文書を検索対象にすることができます
  • 数万件単位の大量の文書もすばやく検索できます

SQL検索(AltSearch)では標準でカテゴリのAND,OR指定ができますが、PowerSearchプラグインでは基本的に全文検索結果をキーワードに対する文書のマッチング順に表示する仕様になっています。

このエントリではPowerSearchプラグインでカスタム検索条件を指定するカスタマイズ方法についてご紹介します。

カスタム検索条件を追加する手順は下記の通りです。

  1. カスタムフィールドやPower CMS for MTの拡張フィールド、カテゴリ、タグなどでブログ記事やウェブページのカスタム属性を指定します。
  2. 文書ドラフトテンプレートに必要な属性を出力するように指定します。
  3. $conditionにカスタム条件を追加するプラグインを作成します。
  4. 検索フォーム、検索結果テンプレートでフォームと検索結果表示部をカスタマイズします。

文書ドラフトテンプレート

文書ドラフトは、Hyper Estraier独自のデータ形式です。文書ドラフトを中間フォーマットとして使うことで、様々な形式の文書を統合的に扱うことができます。 Power CMS for MTのテンプレートセットには、あらかじめブログ記事とウェブページの文書ドラフトテンプレートが付属しています。

※文書ドラフトの例

@uri=http://powercms.alfasado.net/02_product_enterprise.html
@title=Power CMS for MT エンタープライズ版
@author=Alfasado Inc.
@cdate=2010-01-14T12:11:18+09:00
@mdate=2011-03-01T08:07:45+09:00

エンタープライズ検索やリモートバックアップ、既存HTMLの一括インポート等、
ブログエンジンの常識を覆る使いやすさと圧倒的なコストパフォーマンスで、
戦略的なサイト運用を強力にサポートします。
ドラッグ&ドロップインターフェイス
画像やファイルの登録はデスクトップからドラッグ&ドロップで。
リンクの挿入、フィールドや項目の並べ替えもドラッグ&ドロップで自由自在に行えます。
...(以下、検索対象のテキストが続く)
    Power CMS for MT Blog ブログ モバイル 検索 PDF検索
...(タブ文字で始まっている行は隠しテキストとして扱われる)

※Power CMS for MTのブログ記事ドラフトテンプレート

@uri=<$MTEntryPermalink$>
@title=<$MTEntryTitle is_draft="1"$> 
@cdate=<$MTEntryDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$> 
@mdate=<$MTEntryModifiedDate format="%Y-%m-%dT%H:%M:%S"$><$MTBlogTimezone$> 
@blog_id=<$MTBlogID$> 
@suffix=html 
<mt:if tag="EntryCategory">parent=<$MTEntryCategory is_draft=1$> 
parentUrl=<$MTEntryLink archive_type="Category"$></mt:if> 
 <$MTEntryTitle is_draft="1"$> 
<$MTEntryBody is_draft="1"$> 
<$MTEntryMore is_draft="1"$> 
<$MTEntryKeywords is_draft="1"$>

ブログ記事ドラフトテンプレートの以下の部分にブログ記事のメインカテゴリを出力する記述が書かれています。

<mt:if tag="EntryCategory">parent=<$MTEntryCategory is_draft=1$> 
parentUrl=<$MTEntryLink archive_type="Category"$></mt:if>
parent=CMS
parentUrl=http://example.com/path/to/category/index.html

これを以下のURLで検索できるようにカスタマイズします。

http://example.com/cgi-bin/mt/mt-estraier.cgi?blog_id=1&category=CMS&query=検索文字列

プラグインによるカスタマイズの実装

カスタマイズはプラグインを作成して pre_estraier_search コールバックに対応したコードを記述することで実装します。 カスタム条件は pre_estraier_search の第3引き数 $condition に対して add_attr メソッドで指定します。

※config.yaml

id:  CustomSearch
key: customsearch
name: Custom Search
callbacks:
    pre_estraier_search: >
        sub {
            my ( $cb, $app, $condition ) = @_;
            my $category = $app->param( 'category' );
            my $cond = "parent STREQ $category";
            $$condition->add_attr( $cond );
        }

STREQは文字列の一致を意味します。その他に様々な条件の指定が可能です。

※条件の指定

  • EQ : 指定した文字列と一致する。
  • STRNE : 指定した文字列と一致しない。
  • STRINC : 指定した文字列を含む。
  • STRBW : 指定した文字列で始まる。
  • STREW : 指定した文字列で終わる。
  • STRAND : 指定した文字列の全てのトークンを含む。
  • STROR : 指定した文字列の一つ以上のトークンを含む。
  • STROREQ : 指定した文字列の一つ以上のトークンと一致する。
  • STRRX : 指定した文字列の正規表現に合致する。
  • NUMEQ : 数値や日付が指定したものと等しい。
  • NUMNE : 数値や日付が指定したものと等しくない。
  • NUMGT : 数値や日付が指定したものより大きい。
  • NUMGE : 数値や日付が指定したものと同じかより大きい。
  • NUMLT : 数値や日付が指定したものより小さい。
  • NUMLE : 数値や日付が指定したものと同じかより小さい。
  • NUMBT : 数値や日付が指定したものの間である。

複数の条件を指定するには add_attr メソッドを複数呼び出します。この場合すべての条件にマッチするAND条件指定になります。

no_smoking(禁煙席有り)、japanese(和食メニューあり)といったカスタム属性を指定してその両方にマッチするものを検索する場合、下記のように指定することができます。

$$condition->add_attr( "no_smoking NUMEQ 1" );
$$condition->add_attr( "japanese NUMEQ 1" );

set_orderメソッドで検索結果の表示順を特定の属性値をキーにすることができます。

$$condition->set_order( 'no_smoking NUMA' );

※表示順の指定

  • STRA : 文字列(辞書順)の昇順。
  • STRD : 文字列(辞書順)の降順。
  • NUMA : 数値または日付の昇順。
  • NUMD : 数値または日付の降順。

テンプレートの実装にはカスタムフィールドやPower CMS for MTの拡張フィールドを使えば簡単に実現できます。

OR条件指定は属性名をカンマで区切ることで行えます。japanese、chineseいずれかにマッチするものは以下のように指定します。

japanese,chinese NUMEQ 1

もう少し曖昧な条件指定をしたい場合は、文書ドラフトのボディ部に条件をつないだ形で値を入れることも検討すると良いかもしれません。

カスタム属性に指定した値を検索結果テンプレートで呼び出すにはMTEstraierResults(MTEstraierBlock)ブロックタグのループの中で MTEstResultAttribute タグを使います。

さきほどの例は(カテゴリ名、カテゴリURL)、以下のタグで呼び出すことができます。

<$MTEstResultAttribute attribute="parent"$>
<$MTEstResultAttribute attribute="parentUrl"$>

複雑な検索も簡単なカスタマイズで可能ですので、ぜひマニュアルをお読みいただき、カスタム検索の実装にチャレンジしてみてください。

検索のカスタマイズのご依頼やご相談も受け付けています。詳細についてはこちらからお問合せください

カテゴリー
PowerCMS 2技術情報

ページの先頭へ