はてなキーワードのリダイレクト機能の裏側

同じ意味のキーワードを一つにまとめるリダイレクト機能を追加しました。
これまで「Google」と「グーグル」のように、一つの同じ意味であるにもかかわらず、複数のキーワードとして登録されてしまう場合がありました。今回追加した、同じ意味のキーワードをまとめるリダイレクト機能を用いることで、一つのキーワードにまとめることができるようになりました。

同じ意味のキーワードをまとめるリダイレクト機能を追加しました - はてなキーワード開発ブログ

はてなキーワードの「同じ意味のキーワードを一つにまとめるリダイレクト機能」をリリースして2週間がたちました。機能の名前が長くてわかりづらい割に地味なリリースでしたが、中身は大きく変化していますので裏側の仕組みを解説してみようと思います。

リダイレクト機能とは

そもそも、「リダイレクト機能」ってわかりづらいですね。
先行して同様の機能を実装している、Wikipediaニコニコ大百科 の説明を参照してみましょう。

リダイレクト(転送)とは、ある記事へリンクしたときに、別のページに転送する機能のことです。また、そのようなページをリダイレクトページ(転送ページ)と呼びます。
通常、ウィキペディアの記事名は正式名称で作られますが、このリダイレクトページを作っておくと、略称や別名や別の表記で記事を検索しても、実際に存在する記事へ自動的に転送されるようになります。

Wikipedia:リダイレクト - Wikipedia

記事によっては特定の記事の略称だったり微妙に違ったりで正確な名称の記事へリンクさせたい。そういう場合は以下のようにするとその記事を開いたときに自動で正しい記事へ飛ばすことができます。

リダイレクトとは (リダイレクトとは) [単語記事] - ニコニコ大百科

かいつまんで言うと、同じ意味の言葉を別の文字列で表す場合に、どちらかにまとめてあげると便利だよね!という機能です。
リダイレクト元ページにアクセスすると自動的にリダイレクト先のページに移動(転送/リダイレクト)します。だから「リダイレクト機能」って言うんですね。リリース前に「ゆらぎ機能」とか別の名称も検討したのですが、他サービスで同様の機能が先行してあって、それらが「リダイレクト」という用語を使っているのでむしろ準じた方がわかりやすかろう、という判断ではてなでもこの名前で出しました。

どんなキーワードにリダイレクトを設定すればいいのか

現在、600件ほどのリダイレクト設定をユーザーさんにしていただいています(キーワード編集にご協力してくださっているユーザーさん、いつもありがとうございます!!)。
どういうキーワードがリダイレクト設定されているか、というと大まかには以下のような分類ができそうです。

  1. 異表記
  2. 表記ゆれ
  3. 別名
  4. 略称・略号
  5. 英語/日本語

リダイレクト設定をされたキーワードにアクセスすると、転送先のページにはこのように表示されます。

「リダイレクト元を編集」リンクからリダイレクトの解除を行えるので、まずは気軽にリダイレクト設定を試していただければと思います。

もちろん、リダイレクト設定を「した方が良いケース」と「しない方が良いケース」の両方があると思います。事例をためていって、必要であればガイドライン化してみなさんに提示していきたいと考えています。

はてなキーワードにおけるリダイレクトの意味

今までの説明ですと、Wikipediaニコニコ大百科 の機能を はてなキーワード にも載っけました!というだけのようですが違います!
まず、はてなキーワードと他のサービスとの大きな違いは、他のサービスは「百科事典」ですが、はてなキーワードは単なる百科事典ではない、ということです。
もちろん言葉の意味を説明するという「百科事典」としての側面もありますが、それだけではないということです。はてなキーワードには「含むブログ」という「キーワードを使ってブログをつなげる」「キーワードにまつわる口コミをチェックできる」事ができる、というもう一つの側面があります。

そして、リダイレクト機能は、両方の側面に大きく影響する機能なのです。

百科事典 × リダイレクト機能

これは簡単ですね。同じ意味の言葉の説明は一箇所に書けばよい、同じ意味の別のキーワードは一箇所に転送してあげるのがよい、という発想です。

含むブログ × リダイレクト機能

はてなキーワードにリダイレクトを設定する意味はもう一つ(以上)あります。
リダイレクト設定されたキーワードの「含むブログ」ページには、両方の言葉のどちらかを含むブログが集まるのです!
たとえば、現在こんなリダイレクトが設定されています。

ハートキャッチプリキュアハートキャッチプリキュア! (感嘆符ある/なし)
ハートキャッチプリキュア!ハートキャッチプリキュア! (感嘆符半角/全角)

この設定により、ハートキャッチプリキュア!に関するブログ記事まとめ ページでは、感嘆符が全角なもの、半角なもの、含まないもの、全てをまとめて読むことができるのです。


「含むブログ」ページは、そもそも「あるキーワードを含むブログ」を繋げたい・一覧したい、という欲求から作られたページです。「あるキーワード」というのは「ある文字列」ではなく、同じ意味の言葉であれば異なる文字列でも同じように扱って欲しい、というのも人間から見ると当然の希望ですが、機械的にパターンマッチをした結果ではそれが叶いません。今回の機能でそれをある程度解消できたと思っています。

もちろん、リダイレクトの設定を人手で行うという対応が完全とは言えません。それが自動でなされるのが一番幸せだと思いますので、ルール化できる部分は自動でゆらぎを吸収するといった施策を次の一手として考えています。

含むブログのリダイレクト対応の裏側

含むブログは、2008年のエンジニアインターンの成果であるはてなダイアリー全文検索機能がバックエンドになっています。これは、はてなキーワードで作成されたインデックスから、ある語を含むブログエントリのドキュメントIDを高速に出力します。
この全文検索エンジンの特徴として以下のものがあります。

  • インデックス対象をはてなキーワードに絞る事によりインデックスサイズを小さく収め高速に結果を返す
  • 出力が新着順になっている
  • ドキュメントIDは新着順になっており、さらにドキュメントIDから日付などのメタ情報を算出できる
  • 特定の日付(ドキュメントID)より前、という条件で引ける

今回、含むブログをリダイレクトに対応するにあたり、全文検索エンジン自体の刷新も考えましたが、これらの特徴を活かすことでエンジンには手を入れず、クライアント側で工夫することで速度をほぼ落とさず実現することができました。

  1. 複数のキーワード毎に期間指定をして全文検索エンジンから "ドキュメントID" を引く
  2. 結果をマージする
  3. "ドキュメントID" でソートする
  4. ページ表示に必要な分を残して削除する
  5. 表示に必要な情報を日記やユーザーデータベースから引く
  6. 次のページを表示するための期間指定は最後の ドキュメントID から逆算できる
  7. ページング毎に、以上を繰り返す

工程(1)の検索エンジンへのリクエストはがリダイレクトが設定された回数だけ走りますが、ここはボトルネックにはなっておらず、むしろ工程(5)の処理が支配的でした。
ですから今回は、工程(5)の速度をこれまでより速くすることに注力し、そこをチューニングすることで表示内容をリッチにしつつユーザー体験は損ねないように工夫しました。

速度向上は、ネットワークIO要因の速度低下を減らす(発行するSQLの数をなるべく減らす。適切にキャッシュする)、回数の多い計算(今回の場合、ドキュメントIDのマージ、およびソート)に高速なアルゴリズムを適用する、といった地道な改善を続けました。

おかげで、2008年のリニューアルで少し遅くなっていた「含むブログ」を快適な速度にできたのではないかと思います。

含むブログの裏側

全文検索を導入する前の「含むブログ」は、一種類のテーブル(時間軸で分割しているので一個の、というわけではありません)に双方向インデックスを張る事で実現していました。
インデックスが双方向に張られていたのは次の二種類の目的のためでした。

  1. あるブログエントリを表示する際にキーワードリンクを施す
    • (ユーザー,エントリ) から キーワードを引く
  2. あるキーワードを含むブログエントリを表示する
    • キーワード から (ユーザー,エントリ) を 時系列で引く

このテーブルひとつで、はてなダイアリーの主機能がまかなわれていたわけですが、ブログ数の増加に伴いスケールさせる事が困難になりました。
そこで2008年のリニューアルで(2)の役割を全文検索エンジンに移行したわけです。

全文検索エンジンのお陰でスケールはするようになったのですが、別の問題が生まれます。ブログにキーワードを書いた際に、インデックスを二種類書き込まなければいけなくなりました。これにより「日記に書いたけどすぐに『含むブログ』に載らない」といった事態が発生したのです。
日記更新時に全文検索のインデックスを追加しても、アプリケーション層でキャッシュをしていると、キャッシュのパージもしてやらないと「含むブログ」に表示されるまでにタイムラグが生じてしまいます。
今回のリダイレクト対応では、アプリケーション層のキャッシュを思い切って少なくし、キャッシュのパージの仕組みをシンプル化し、「含むブログ」に表示されるまでのラグをなるべく短くする事にも注力しました。

まとめ 「キーワードでつながる」

  • キーワードにリダイレクト機能ができました
  • リダイレクト機能は、意味の同じキーワードをまとめます
  • まとめることで、百科事典的にも「含むブログ」的にも嬉しいです
  • 「含むブログ」の表示速度を向上しました
  • 日記を書いて「含むブログ」に載るまでのタイムラグも短くしています

はてなダイアリーには「キーワードでつながる面白ブログ」というキャッチコピーがありました。はてなダイアリーの原点はまさにそこだと思っていますので、「キーワードでつながる」体験をより充実させていくように、はてなダイアリーはてなキーワード両面から進化させていきたいと思います。