※ この機能はエンタープライズ版以上のライセンスをご購入の場合のみご利用可能です
PowerCMS にはダイナミック検索が標準で付属していますが、別途インデックス型の検索エンジン Hyper Estraier を利用したインデックス型検索をサポートしており、検索インデックスをタスクで実行するプログラム及び検索結果を出力するためのテンプレートタグが提供されます。
- 全文検索にはサーバーに Hyper Estraier 及び Perl モジュール Estraier がインストールされていることが必要です(※)。
- 全文検索システム Hyper Estraier およびそのインストール方法については 公式サイト を参照してください。
- 検索画面を表示する mt-estraier.cgi (後述) は、管理画面が利用するデータベースを CGI から参照できる必要があります。Copy2Public による転送機能との併用はできません。
※ Hyper Estraier 本体に加え、Perl モジュールをインストールする必要があることにご注意ください。Perl モジュール Estraier は、Hyper Estraier 本体のアーカイブ内、perlnative
フォルダ内に同梱されています。インストール手順は こちら をご参照ください。
Hyper Estraier のインストール
Hyper Estraeir のインストールを行うには QDBM を先にインストールする必要があります。QDBM のインストールは下記ページを参照してください。
検索インデックスの作成
生成される記事/ウェブページは、PowerCMS のテンプレートによって文書ドラフト (Hyper Estraier の独自のファイル形式) に変換されます。各種設定を適切に行った後、 $MT_DIR/tools/estcmd-gather
スクリプトを実行することで検索用インデックスが生成されます。
PDF や Microsoft Excel 等のファイルのインデックスは、ウェブサイト/ブログのサイトパス以下に配置されたすべてのファイルを対象にインデックス作成を行います (ウェブサイト/ブログごとのプラグイン設定で除外パスを指定することも可能です)。
検索インデックスの自動更新
午前4時に検索インデックスをすべてクリアして新規にインデックスを作成する場合の crontab 設定例
0 4 * * * cd $MT_DIR && /usr/bin/perl tools/estcmd-gather
20分おきに検索インデックスに差分登録する場合の crontab 設定例
0,20,40 * * * * cd $MT_DIR && /usr/bin/perl tools/run-periodic-tasks
※差分登録は、プラグインの設定で「インデックスアップデート」にチェックを入れてる場合のみ動作します。
エンタープライズ検索関連のテンプレート
PowerCMS のテーマをインストールすると、以下のテンプレートが同時にインストールされます。
種別 | 名前 | アーカイブパス | 解説 |
---|---|---|---|
アーカイブ | 記事ドラフト | draft/entry_<MTEntryId>.est | 文書ドラフト(Hyper Estraier 独自のデータ形式)で記事を出力します。 |
アーカイブ | ウェブページドラフト | draft/entry_<MTPageId>.est | 文書ドラフト(Hyper Estraier 独自のデータ形式)でウェブページを出力します。 |
システム | Hyper Estraier 検索結果 | - | 検索結果を表示するテンプレートです。 ※手動でテンプレートを作成する場合、identifier が「estraier_result」である必要があります。 |
文書ドラフトテンプレート
検索に含めるテキストの範囲を変更するには (拡張フィールドやカスタムフィールドを含める場合)、記事ドラフト及びウェブページドラフトテンプレートを修正します。 カスタムフィールドや拡張フィールドの値を検索対象に含める場合、MTEntryKeywords タグの後に値が出力されるようにテンプレートを調整します。モディファイア is_draft を追加することで、データ中の HTML タグを削除します (画像の alt 属性は展開されます)。
標準の記事ドラフトテンプレート
@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"$>
文書ドラフトの出力例
@uri=http://example.jp/contact/
@title=お問い合わせ
@cdate=2009-02-06T18:24:07+09:00
@mdate=2009-02-10T19:52:38+09:00
@blog_id=1
@suffix=html
parent=PowerCMS
parentUrl=http://example.jp/
お問い合わせ
以下の文章はサンプルです。内容を適切に書き換えてください。
お問い合わせはメールで: email (at) example.jp
文書ドラフトについては Hyper Estraier のドキュメントを参照してください。
User’s Guide of Hyper Estraier Version 1 (Japanese)
(以下、ドキュメントより抜粋)
- 文書ドラフトは以下の仕様を満たす必要があります。
- 正常な UTF-8 エンコードのテキストから構成されます。
- 改行形式は UNIX 形式 (LF) か MS-DOS 形式 (CR+LF) のどちらかです。
- 属性部とテキスト部からなり、両者は最初に出現した空行で区切られます。
- 属性部において、各行は属性の指定として扱われます。属性名と値は最初に出現した「=」で区切られます。
- テキスト部において、各行は本文の文字列として扱われます。行頭がタブ文字で始まっている場合、その行は隠しテキストとして扱われます。
検索の実行とテンプレート
インデックスの生成が完了したら、以下のような URL より検索を実行します。
http://example.com/mt/mt-estraier.cgi?blog_id=*
検索フォームおよび検索結果の表示に使われるテンプレートは、パラメータ blog_id で指定したウェブサイト/ブログのシステムテンプレート「Hyper Estraier 検索結果」が使用されます。パラメータ blog_id を省略した場合、全てのウェブサイト/ブログの中からソースコード内で一番最初にロードされたウェブサイト/ブログのシステムテンプレート「Hyper Estraier 検索結果」が使用されます。この場合、該当のウェブサイト/ブログは ID が一番若いものになることが多いでしょう。
様々な条件を指定したカスタム検索をテンプレートのみで実装する
カスタム検索がテンプレートの設定のみで可能です。例えばカテゴリ配下の記事を検索する場合は mt-estraier.cgi に以下のようなパラメタを追加します。
mt-estraier.cgi?limit=10&offset=1&blog_id=1&query=検索文字列&parent=カテゴリ名
テンプレートには以下のように add_attr
、add_condition
モディファイアを追加します。
<MTEstraierResults add_attr="parent" add_condition="STROREQ">
…
</MTEstraierResults>
文書ドラフトの属性に追加した属性であれば検索条件に指定することができるため、例えば加えてカスタムフィールドの値によるフィルタリングを指定することができます。以下の例は、記事カスタムフィールド「MTEntryCustom」を指定し、その値を検索条件に追加する文書ドラフトテンプレートの例です。
@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$>
@suffix=html
@blog_id=<$MTBlogID$>
@entry_id=<$MTEntryID$><MTIf tag="EntryCategory">
parent=<$MTEntryCategory is_draft="1"$><MTIfArchiveTypeEnabled type="Category">
parentUrl=<$MTEntryLink type="Category"$></MTIfArchiveTypeEnabled></MTIf><MTIf tag="EntryCustom">entry_custom=<MTEntryCustom is_draft="1"></MTIf>
<$MTEntryTitle is_draft="1"$>
<$MTEntryBody is_draft="1"$>
<$MTEntryMore is_draft="1"$>
<$MTEntryKeywords is_draft="1"$>
この時 CGI に渡すパラメタは以下のようになります。
/mt-estraier.cgi?limit=10&offset=1&blog_id=1&query=検索文字列&entry_custom=カスタムフィールドの値&parent=カテゴリ名
複数指定の場合、テンプレートの add_attr
、 add_condition
を配列で指定します。
<MTEstraierResults add_attr="parent","entry_custom" add_condition="STREQ","STREQ">
…
</MTEstraierResults>
完全一致の場合 add_condition
モディファイアに渡す値は STREQ
となりますが、その他様々な条件の指定が可能です。
※ 条件の指定
- STREQ : 指定した文字列と一致する
- STRNE : 指定した文字列と一致しない
- STRINC : 指定した文字列を含む
- STRBW : 指定した文字列で始まる
- STREW : 指定した文字列で終わる
- STRAND : 指定した文字列の全てのトークンを含む
- STROR : 指定した文字列の一つ以上のトークンを含む
- STROREQ : 指定した文字列の一つ以上のトークンと一致する
- STRRX : 指定した文字列の正規表現に合致する
- NUMEQ : 数値や日付が指定したものと等しい
- NUMNE : 数値や日付が指定したものと等しくない
- NUMGT : 数値や日付が指定したものより大きい
- NUMGE : 数値や日付が指定したものと同じかより大きい
- NUMLT : 数値や日付が指定したものより小さい
- NUMLE : 数値や日付が指定したものと同じかより小さい
- NUMBT : 数値や日付が指定した二つのものの間である
複数の条件を指定するには add_attr
メソッドを複数呼び出します。この場合すべての条件にマッチする AND 条件指定になります。演算子の先頭に ! をつけると演算子の条件に当てはまらないものに絞り込みできます。例えば !STREQ を指定すると STREQ の条件に当てはまらないもので絞り込みできます。
また、絞り込み条件では英大文字と小文字を区別して動作しますが、演算子の先頭に I を指定すると大文字と小文字の違いを無視します。例えば ISTREQ を指定すると大文字と小文字の違いを無視して STREQ の条件に当てはまるもので絞り込みできます。
さらに、表示順の指定も可能です。 set_order
、 order_condition
モディファイアによって、テンプレートのみで指定することができるようになりました。MTQuery タグを使えば、さらに検索パラメタでの表示順指定も可能です。
<MTEstraierResults set_order="entry_custom" order_condition="NUMA" add_attr="parent" add_condition="STROREQ">
…
</MTEstraierResults>
order_condition
モディファイアに渡せる値は以下のいずれかとなります。
- STRA : 文字列(辞書順)の昇順
- STRD : 文字列(辞書順)の降順
- NUMA : 数値または日付の昇順
- NUMD : 数値または日付の降順
set_order
と order_condition
が未指定の場合、検索結果はスコア順(降順)で表示します。文書に指定した検索語が多く含まれているとスコアは高くなります。
(検索クエリに関わらず)条件指定のみでフィルタリングする
CGI へのパラメタ no_query=1 もしくは テンプレートにモディファイア no_query=”1” を指定することで、検索クエリに関わらず条件指定のみでフィルタリングすることが可能です。
<MTEstraierResults no_query="1" add_attr="parent","entry_custom" add_condition="EQ","EQ">
…
</MTEstraierResults>
mt-estraier.cgi?limit=10&offset=1&blog_id=1&no_query=1&entry_custom=カスタムフィールドの値&parent=カテゴリ名
環境変数の設定
以下の環境設定を記述します。
設定項目 | 解説 | 設定例 |
---|---|---|
EstCmdPath | Hyper Estraierのコマンド「estcmd」のパスを記述します。 | /usr/local/bin/estcmd |
EstFilterPath | PDF や MS Office 文書のインデックスを作成する外部コマンドのフィルタのパスを記述します。 | /usr/local/share/hyperestraier/filter |
EstCmdIndex | 検索用のインデックスを作成するパスを記述します。 | /var/www/estindex/casket |
EstraierScript | 検索 CGI スクリプトの名前を記述します (省略可)。デフォルト値はmt-estraier.cgiです。 | search.cgi |
記述例
EstcmdPath /usr/local/bin/estcmd
EstFilterPath /usr/local/share/hyperestraier/filter
EstcmdIndex /var/www/estindex/casket
EstraierScript mt-estraier.fcgi
プラグインの設定
システムプラグイン設定及びウェブサイト/ブログの PowerSearch プラグイン設定で指定する設定項目は以下の通りです。同一の設定項目については、ウェブサイト/ブログの設定値が優先されます。
システムのプラグイン設定
設定項目 | 解説 | 設定例 |
---|---|---|
文書ドラフトのディレクトリ | 文書ドラフトテンプレート(記事ドラフト/ウェブページドラフト)の出力先ディレクトリを指定します。検索インデックス生成の際に、指定したディレクトリ内の文書ドラフトファイルが対象になります。 | draft |
デフォルト言語 | 検索に利用するデフォルトの言語を指定します。 | ja |
HTML 以外の検索対象 | PDF や MS Office 文書等、HTML 以外に検索インデックスへ登録したい文書の拡張子をカンマ区切りで指定します。 ※この設定で指定しなかった拡張子のファイルは検索インデックスへ登録されないため検索条件に関係なく検索できなくなります |
xlsx,docx,pptx,xls,doc,ppt,pdf |
インデックスアップデート | チェックを入れると、記事/ウェブページの作成・更新時やアイテムのアップロード時にインデックスへの登録やアップデートを行います(インデックスへ反映されるのは、タスク run-periodic-tasks の実行時)。 | |
デフォルトのページ送り件数 | 1ページあたりに表示される検索結果の件数を指定します。 | 20 |
ウェブサイト/ブログのプラグイン設定(システムのプラグイン設定よりも優先されます)
設定項目 | 解説 | 設定例 |
---|---|---|
文書ドラフトのディレクトリ | 文書ドラフトテンプレート(記事ドラフト/ウェブページドラフト)の出力先ディレクトリを指定します。検索インデックス生成の際に、指定したディレクトリ内の文書ドラフトファイルが対象になります。 | draft |
デフォルト言語 | 検索に利用するデフォルトの言語を指定します。 | ja |
HTML 以外でインデックス対象から除外したいパス | HTML 以外のファイルを検索対象に含める場合、検索対象外としたいディレクトリのパス(前方一致、改行区切り)を指定します。 | /path/to/blog/exclude/path/to/blog/secret/index.html |
テンプレートタグ
ブロックタグ
ファンクションタグ
モディファイア
Windows Server 2008 でのエンタープライズ検索のセットアップ
Windows Server 2008 でエンタープライズ検索を利用する場合には、PowerCMS に同梱の Hyper Estraier のセットアップと Perl モジュール (PPM パッケージ) のインストールが必要です。
Hyper Estraier のセットアップ
PowerCMS に同梱の hyperestraier-1.4.12.zip を展開し、適切なディレクトリ (例: C:hyperestraier) に配備します。次に、システム環境変数 PATH に、このディレクトリへのパスを追加します。
Windows Server 2008 でエンタープライズ検索を利用する場合には、必ず PowerCMS に同梱の Hyper Estraier をご利用下さい。公式配布版など、その他の Hyper Estraier では、エンタープライズ検索をご利用いただけません。
Perl モジュール (PPM パッケージ) のインストール
PowerCMS に同梱の Estraier-1.5.zip を一時的なディレクトに伸長 (解凍) します。次に、コマンドプロンプトを開き、Estraier.ppd のあるディレクトリに移動します。
次のコマンドを入力します。
ppm install Estraier.ppd
以上で、エンタープライズ検索が利用可能な環境が整いました。