PowerSearchで記事に一意に対応する詳細ページを設けない場合に検索で引っかからない場合の原因と対応

投稿日: 更新日:

今後もありがちなのでメモっとく。

次の前提を考える。

  • PowerCMSで対象スペース配下の公開中記事を検索し、一覧ページにリストアップする機能を設ける。
  • 記事に一意に対応する詳細ページは出力せず、代わりに形式的に皆「[スペースパス]/customurl」とパスでファイルを出力。出力元のアーカイブテンプレートは優先アーカイブである。
  • 記事に一意に対応するPowerSearch向けの記事ドラフトファイルを出力する記事アーカイブテンプレートが有効である。

これで検索をかけると、詳細ページを出力しない(=[スペースパス]/customurlでファイルを出力する)記事は検索に全く引っかからなかった。

原因は、記事ドラフトを出力するアーカイブテンプレートの次のコードだった。

@uri=<$MTEntryPermalink escape="html"$>

具体的には、まず前提としてPowerSearchの検索インデックス作成の仕組みを把握する必要がある。

仕組みとして、作成される検索インデックスの中身のイメージとしては、次のハッシュのような形式のデータの羅列である。

[@uriの値]:[検索対象オブジェクトに一意に対応するのユニークID]

踏まえて、前述の記事ドラフトを出力するテンプレートでは、@uriの値がみな同じになってしまう。

結果として、検索インデックスの登録時に同じキー(@uri)に異なる記事のIDを設定する形になるので、そこで上書きが起きてしまい、1つしか記事が検索インデックスに登録されなくなる。

これはPowerSearchが使っているHyperEstraierの公式の説明にも、それと思しきものがある。
Introduction of Hyper Estraier Version 1 (Japanese) (dbmx.net)

なお、既存の文書とURLが同じ文書を登録すると上書きされますので、古い文書は検索にヒットしなくなります。

対策としては、前述の記事ドラフトの@uriの値をユニークにする事で改善される。
なお、この時優先アーカイブに指定した記事アーカイブテンプレートのアーカイブマッピングまでいじる必要は無い。

@uri=<$MTEntryPermalink escape="html"$>/<mtentryid pad="1" />

関連するタグ

HyperEstraier, PowerSearch