2022年02月09日
エンタープライズ検索で記事ごとに検索対象から除外する方法
PowerCMS のエンタープライズ検索 (PowerSearch プラグイン) では様々な条件での絞り込み検索が行えます。 絞り込み条件では NOT 検索も可能ですが、今回紹介するのは、検索結果から除外するのではなく検索対象から除外、そもそも検索させない方法です。
今回は、記事ごとに除外するか選択できる実装方法を紹介します。
運用イメージ
- 記事の作成/編集画面でカスタムフィールド「検索対象から除外する」にチェックを入れるとその記事は検索されない
こちらを実現する作業のおもなステップは下記の3つです。
実装手順 1. 記事へカスタムフィールドを設定する
記事に対して下記のようなカスタムフィールドを作成します。
項目 | 設定例 |
---|---|
名前 | 検索対象から除外する |
説明 | 検索されたくない記事の場合はチェックを入れてください |
システムオブジェクト | 記事 |
種類 | チェックボックス |
ベースネーム | entry_exclude_search |
タグ | EntryExcludeSearch |
実装手順 2. アーカイブマッピングへカスタムフィールドタグを記述する
ドラフトファイルを生成するアーカイブテンプレートのアーカイブマッピングへ、手順1. で作成したカスタムフィールドタグを下記のように変更してください。
修正前のアーカイブマッピング例
draft/entry_%E.est
修正後のアーカイブマッピング例
<MTUnless tag="EntryExcludeSearch">draft/entry_%E.est<MTElse>draft_exclude/entry_%E.est</MTUnless>
修正は修正前のテンプレートを囲む内容ですが、アーカイブマッピングを修正する際は空白や改行のなど不可視文字の入力に注意して行ってください。
<MTUnless tag="EntryExcludeSearch"> (修正前のアーカイブマッピングの内容) <MTElse> draft_exclude/entry_%E.est </MTUnless>
実装手順 3. ドラフトファイルを出力するテンプレートの内容を変更する
ドラフトファイルを出力するテンプレートの内容を下記のように、カスタムフィールドタグがなかった場合に何も出力しないように変更します。
<MTUnless tag="EntryExcludeSearch"> (修正前のテンプレートの内容) </MTUnless>
実装手順は終了
以上で実装は完了です。
今後、カスタムフィールド「検索対象から除外する」にチェックを入れた記事は検索されなくなります。
仕組みの解説
エンタープライズ検索はドラフトファイルの内容を検索インデックス (検索用のデータベース)へ登録し、その検索インデックスに対して検索を行います。
ですので、ドラフトファイルの内容を検索インデックスへ登録しないことで検索されないようにでき、今回の実装手順ではドラフトファイルの内容と生成場所を変更することで実現しています。
解説 1. 記事へカスタムフィールドを作成する
記事毎に検索されないことを設定するためにカスタムフィールドを作成しました。
今回は検索されないことを目的としていましたが、逆に、検索される記事のみチェックを入れる実装も可能です。
解説 2. ドラフトファイルを出力するテンプレートのアーカイブマッピングを変更する
検索インデックスに登録されるドラフトファイルは draft ディレクトリ(プラグイン設定で変更可能) に、拡張子が est であるとう条件があり、他のディレクトリへドラフトファイルを出力したり、拡張子を変更することで検索インデックスへ登録できなくできます。
この手順では検索されたくない記事のドラフトファイルは draft_exclude ディレクトリへ出力しています。
ドラフトファイルを出力するディレクトリを変更するのではなく、拡張子を変更することでも実現できますが、ディレクトリを変更した方が、本記事でドラフトファイルのディレクトリを変更しているのは検索されたくない記事について検索インデックスの作成・更新時にかかる時間を軽減するためです。
解説 3. ドラフトファイルを出力するテンプレートの内容を変更する
検索インデックスに登録されるドラフトファイルはドラフトファイル用のフォーマットで記述されている必要があります。
この手順では検索されたくない記事のドラフトファイルの内容を空にしています。
ドラフトファイルのフォーマットについては @uri
の指定がないだけで、検索インデックスへ登録されないようにできますが、本記事でテンプレート全体の内容を囲っているのは検索されたくない記事のドラフトファイルの再構築にかかる時間を軽減するためです。
FAQ
Q. 今回とは逆に、特定の記事のみ検索されるようにできますか?
はい、特定の記事のみ検索することも可能です。
Q. 記事毎ではなくカテゴリやタグによって制御できますか?
はい、カテゴリやタグを条件によって制御することもできます。
条件を変更する場合は手順 2-3. を変更する必要があります。
Q. 手順 2. と手順 3. のどちらかのみの実装でも検索されないようにできますか?
はい、手順 2. と手順 3. のどちらかのみの実装でも実現可能ですが、両方を行った方がパフォーマンス低下の軽減になるため両方行われることをおすすめいたします。手順 2. は estcmd-gather スクリプトの実行にかかる時間の短縮に繋がります。
コメントを投稿する