linkerは「人と人」「人と情報」「人と物」をつなぐデザインユニットです。

Hyper Estraierを使う場合はURI属性が重複しないように細心の注意を。

みなさん、こんにちは、まーしーです。
だいぶ寒くなってきたので作業場所のところにヒーターを出してきました。
暖かくなると今度は睡魔との闘いですね。。。

さて、Hyper Estraierを使っていて思わぬところではまったのでそのことでもメモ的に書いておこうかと思います。

Hyper Estraierをつかって全文検索

MTで検索を使うときはsearch.cgiなどをつかいますが、PowerCMSを使っている場合には検索はいくつか方法があります。
そのなかでHyper Estraierを使って行うことがあります。

Hyper Estraier - Wikipedia
http://ja.wikipedia.org/wiki/Hyper_Estraier

検索用のデータをそれぞれ用意しておきそれらをインデックスして、そのインデックスしたものを検索して結果を返すかんじです。
なので、検索用のデータは例えばブログ記事アーカイブで表に見えるものとは別のアーカイブとして用意したりします。

その検索用のデータとして必要なのは以下のような項目です。

@id : 文書をインデックスに登録した際に自動的に振られます。
@uri : 文書の参照方法を示します。全ての文書に必須です。
@digest : 文書のメッセージダイジェストを示します。登録時に自動算出されます。
@cdate : 文書の作成日時を示します。
@mdate : 文書の最終更新日時を示します。差分更新に使われます。
@adate : 文書の最終参照日時を示します。
@title : 文書のタイトルです。検索結果で見出しとして扱われます。
@author : 文書の著者です。
@type : 文書のメディアタイプです。
@lang : 文書の言語です。
@genre : 文書の様式です。
@size : 文書のサイズです。
@weight : 文書のスコアリングの重み付けです。
@misc : 文書の雑多な情報です。

User's Guide of Hyper Estraier Version 1 (Japanese)
http://fallabs.com/hyperestraier/uguide-ja.html#attributes

ID属性は自動で振られるのですが、URI属性については検索用のデータを識別するものとして使われるので基本的には重複しない一意なものとなっています。
URI属性が重複している場合は検索用のデータ自体が上書きされてインデックスされてしまいます。

URI属性にどのような値を持たせるか?

URI属性は重複してはまずいのでMTで使うとしたら
@uri=<$MTEntryPermalink$>
などuniqueになるものが使われたりすることが多いかと思います。

このURI属性に入れる値には気をつける必要がでてきます。

「<$MTEntryPemalink$>」を使っている場合は基本basenameはuniqueになるようになっているので重複する可能性は低いですが、「<$MTPagePermalink$>」を使っているとuniqueにならない可能性もあります。
(EntryPermalinkも絶対に重複しないか?というとそうとも限りませんが・・・)

カスタムフィールドの値があったらその値を使う場合、カスタムフィールドに入れる値が他のPermalinkと重複してしまう可能性もあるでしょう。
個別のアーカイブを持たない場合などもあるのでその際にどうするか?ということも考える必要があります。

今回はまっていたのはこのカスタムフィールドの場合なのですが、想定していない使い方だったところで重複して上書きされてしまい、元の方が検索されないという状況でした。
想定していないのも問題でしょうし、そういうことが起こりうる可能性をつぶしておかなかったことも問題だったとは思います。

なのでURI属性の値については細心の注意を払わないといけませんね。

ミスが起こらない作り方を優先

このような制作側が想定していない運用というのは少なからず起こってしまう物だとは思いますが、制作の過程など判断が必要な際に「ミスをしない」「ミスが起こらない」というのを意識しないといけないと改めて思いました。

ウェブサイトやブログの構成もURL、ディレクトリ構造ベースに構築してわかりやすいのも重要ですが、権限に応じた分割や運用の中で考えられる間違いを少しでも減らせる構成にするとかそういったことですね。

失敗しないと成長しないことが多いですが、色々勉強になりました。