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" />