Movable Type の検索機能は奥深い

http://hxxk.jp/2004/12/18/1230

記事データ

投稿者

望月真琴

投稿日時

2004-12-18T12:30+09:00

タグ
概要

Movable Type の検索機能は、閲覧者が実際に目にする文章以外のものも含めて検索するということを覚えておいた方がいいでしょう。本文だけが検索対象ではありません。それを逆手にとって高度な検索をすることもできます。

リプライ

リプライはまだありません。

記事本文

はじめに

私は perl についての知識は全く持っていません。 これから書く事は mt-search.cgi のソースを眺めて得たものではなく、実験を行って得たものです。 よって、もしかしたら mt-search.cgi を書き換えることで望む結果を得たり、効果的な対策を取れたりする可能性があるのかもしれません。

なお、ここではデータベースに MySQL を使用していると仮定してフィールド名などを取り上げています。

コメントも検索してしまう

ここでいうコメントとは、 mt-comments.cgi を通して寄せられる記事への感想や意見といったコメントではなく、 <!-- --> で囲まれたコメントアウト部分のことです。

この記事の検索フォームから、 と入力して検索してみてください。

どうでしょう、検索結果内に MT hxxks Type 002<MTIfNonZero tag="MTCategoryCount"> の意外な落とし穴サブカテゴリから親カテゴリへのナビゲーションをするテンプレートへのアンカーが現れていませんか ? あらかじめ <!-- これはこの記事には関係のないコメントです。別の記事の実験用に挿入しています。 abcdefghijklmnopqrstuvwxyz --> といったコメントを挿入しておいたのですが、このコメントを検索してしまっているようです。

<!-- --> で囲んでいた部分はコメントアウトされているので実際の記事内には現れませんが、 mt-search.cgi による検索を行う場合には検索対象に含まれてしまいます。

見られてはまずい記述を一時的にコメントアウトした

メモ的に残しておいたコメントなら問題ありませんが、一時的に隠す意図でコメントアウトした記述の場合に問題が起こる可能性があります。

コメントアウトしただけでは、ソースを直接見ればその内容は分かりますので、「隠す」という意図にコメントアウトが適していないのは当然なのですが、検索結果の対象になることで見られる可能性が上昇するのは否めません。

対策
  • 残しておく必要のないコメントアウトは消す
  • 一時的に隠しておきたいコメントアウトの場合は、その部分を含んだ記事を下書き状態で作成し、公開状態の記事の中には残さない

HTML タグ内も検索してしまう ( デメリット )

前項のことに気付いたために、何故そうなっているのかを考えました。 mt-search.cgi による検索は実際に生成された HTML による文字列ではなく、データベース上のフィールドを検索しているのではないか ? HTML タグを解釈するのなら、コメントアウトされた部分は無視するのではないだろうか ?

そこで、 dt というキーワードで検索してみると、本文中には dt という文字が含まれていない記事でも、 <dt> という HTML タグに含まれる要素名の文字を検索で見つけ、検索結果として出力されていることが確認できました。

よって、 HTML の要素名になっている単語を検索すると、検索結果に多くのノイズが発生してしまうと言えます。

HTML タグ内も検索できる ( メリット )

HTML タグ内も検索してしまうのなら、要素名だけでなく属性名や属性値も検索できるのでは ? それを活用すれば逆にメリットも得られるのでは ? と思いました。

そこで、 datetime というキーワードで検索してみると、 datetime 属性を持つ要素、すなわち del 要素または ins 要素を含む記事へのアンカーが検索結果に現れました。 他にもちょこちょこと試してみた結果、意外と役立つ検索テクニックが編み出せるのでは、と思いました。

削除・訂正・追記があった記事を探す

前述の通り、 datetime を検索のキーワードにして検索することです。 記事の作成者が del / ins 要素に datetime 属性を記述していることが前提となりますが……。

特定の時期に削除・訂正・追記があった記事を探す

属性値を指定することで、更に絞込みをすることができました。 datetime="2004-11 を検索のキーワードにして検索すると、 2004 年 11 月に削除・訂正・追記があった記事のみを検索することができます。 正規表現と組み合わせることで、時期の範囲指定もできそうです。 ( できそうです、とぼかしているのは、私が正規表現について不勉強であるため。 )

特定のサイトにリンクしている記事を探す

これはサイト名で検索することでも実現できそうですが、より正確に検索をする場合には属性値検索 ( 今名付けた ) の方が良いでしょう。 例を出すと……そうですね、サイト名やハンドルと URI が異なるパターンがいいですね。

ということで冷麺を勝手に例に出させてもらいます。 冷麺を検索のキーワードにして検索すると、 Valid Movable Type !! へのアンカーが検索結果に現れます。 しかし、これは私がサイト名をリンクアンカーにしているから検索結果に現れるのであって、仮にテラヤマアニさんの weblog といったリンクアンカーにしていれば冷麺というキーワードでは検索できません。

そこで、 http://kowagari.net/diary/ を検索のキーワードにして検索すると、リンクアンカーを何にしていようと http://kowagari.net/diary/ に向けてリンクしている記事があれば検索できます。

これは閲覧者向けと言うよりも、 Movable Type を使用しているサイトからのリファラが残っていたサイト作成者向けのテクニックかもしれません。

検索対象となる部分は ?

次に疑問を抱いたのは、本文しか検索できないのか ? という点です。

サイト全体の検索 - 検索フォームを見ると、

<input type="radio" name="SearchElement" value="entries" />エントリー
<input type="radio" name="SearchElement" value="comments" />コメント
<input type="radio" name="SearchElement" value="both" />両方

といった例が示されています。 ふむ、 SearchElement オブジェクトに comments という値を渡せばコメント部分の検索、 entries という値を渡せばエントリ部分の検索、と。 では、 entries という値に含まれる部分はどこまでなのか ?

本文部分や追記部分、概要などに <!-- これはこの記事には関係のないコメントです。別の記事の実験用に挿入しています。 abcdefghijklmnopqrstuvwxyz --> という記述を入れて試した結果、

に該当部分が記述されてあれば、検索結果に出力するようであると分かりました。 要するに、管理画面から入力する部分のほとんどが検索対象となります。

ただし、entry_excerpt フィールド ( 概要(excerpt) ) はその対象外となるようです。 その部分に記述して検索しても、検索結果には現れませんでした。 ただし、手動で概要を入力し、なおかつよほど変なまとめ方をしない限りは「本文中に存在せず概要にのみ出てくる単語」というものは無いと思いますので、そこまで問題は無いでしょう。

まとめと予告

まとめ、というほどのことでもありませんが、 Movable Type の検索機能は、閲覧者が実際に目にする文章以外のものも含めて検索するということを覚えておいた方がいいでしょう。 でないと、 「何で本文中に全く検索キーワードが出現していないのに、検索結果に現れているんだろう ? 」 なんて場面に遭遇するかもしれません。

……と、ここまで書いておいて今さらなんですが、 Movable Type の検索機能って使っていますか ? よく考えたら私は他人の Movable Type の検索機能をほとんど使った記憶がありませんし、私の Movable Type のログを見ても検索に使われたログは数日に 1 ~ 2 件程度です。

次回は複数の weblog を作成している場合の検索テクニックと、その場合における問題点について書こうと思います。

リプライ

リプライはまだ送られていないか、管理者の承認待ち状態です。

この記事に対するご意見やご質問、ご感想などありましたらこのフォームに簡潔に記入して下さい。 簡潔に記入できない場合や、関連記事にてご意見をお寄せいただく場合は、ご自身の weblog にて記事を書かれた上で あてにトラックバックとして送信してください。

記入フォーム

補足情報

著作、講演、制作実績など