mixi engineer blog

*** 引っ越しました。最新の情報はこちら → https://medium.com/mixi-developers *** ミクシィ・グループで、実際に開発に携わっているエンジニア達が執筆している公式ブログです。様々なサービスの開発や運用を行っていく際に得た技術情報から採用情報まで、有益な情報を幅広く取り扱っています。

かんたん友人検索 その壱

朝7時30分に起きて駒沢公園をジョギングすること10日目のmikioです。だいぶ体が軽くなってきて、そろそろ体型にも変化が出てくるかなと期待する毎日です。さて、以前の記事で予告した通り、Tokyo Dystopiaを使ったmixi内の検索機能をインディーズ機能としてリリースしました。「かんたん友人検索」という名のとおり、mixiの登録ユーザを対象として友人や知人を簡単に検索する機能です。操作を簡潔にしながらも、マイミクシィのつながりなどを使って検索精度を高めているのが特徴です。

シンプルにした

見た目として最も大きな特徴は、従来の友人検索よりも入力フィールドの数を減らしたことです。従来では「姓」「名」「ニックネーム」「性別」「年齢(下限)」「年齢(上限)」「血液型」「現住所(都道府県)」「現住所(市区町村)」「出身地(都道府県)」「出身地(市区町村)」「趣味」「職業」「キーワード」「写真」と15個もの入力フィールドを提示するものでした。これでは、どこに何を入力すれば適切に検索できるかよくわかりません。友人検索を最もよく使うのはmixiに登録したての人達なのですが、そういう初心者の人達にこんなにたくさんの選択肢を提供するのは、正直言って、あまり良い設計とは言えないと思います。
■ 従来の検索画面
old_search.png

そこで、かんたん友人検索では、入力フィールドを思い切って一つにしてしまいました。これなら、キーワードを入れて「検索」ボタンを押すだけで、迷う余地が一切ありませんね。ここで検索すると、「姓」「名」「ニックネーム」の全てを対象とした検索が実行されます。

■ シンプルにした検索画面
new_search.png

検索結果は従来と変わらず、該当するユーザのニックネームや写真や紹介文が表示されます。

■ 検索結果の画面
search_result.png

名前検索を統合した理由

従来の検索で「姓」「名」「ニックネーム」を分けていた機構も、mixiのユーザ数がまだ10万人やそこらで、ほとんどのユーザが本名を開示していた時代には期待通りに機能していました。しかし、1500万人超のサイトに成長した現在では、本名の代わりに、「わかる人にだけわかる」ような文字列を名前として登録する人が増えてきました。友達に呼ばれるニックネームや好きな映画のキャラクター名などを使っている人もいます。その方が、「これで検索すれば自分にたどり着けるよ」と人に説明するためのキーワードとして有効だという判断もあるのかもしれません。 そうなると、例えば、姓:"ルパン"、名前:"三世"、ニックネーム:"lupin" という人を従来の検索機能で探す場合には困ったことになります。「そういえばあいつ "ルパン" って名前でmixiやってるって言ってたけど、姓と名とニックネームのどれに指定すればいいかわからん」といったことになります。探す側としては "ルパン" が姓なのか名なのかニックネームなのかはどうでもいいことなので、それらの区分ごとに何回も検索をしてイラっとさせられるよりも、一回の入力で一気に検索できた方が幸せですよね。検索項目を統合したおかげでヒット数が増加して適合率が下がってしまう心配はありますが、この問題に対しては後述するスコアリングの改善で対処しています。

検索オプション

従来の検索でも性別や年齢などの属性で検索結果を絞り込むことができていましたが、実際にそれが使われるケースは多くありませんでした。探したいユーザが必ずしもその性別や年齢などのプロフィールを公開しているとは限らないので、検索条件として指定するとかえってうまく探せないことが多いからでしょう。とはいえ、一般的過ぎる名前を使っているユーザの検索結果を絞り込むのには有用であることもないとは言いきれないので、機能としては残すことにしました。

「よく使う機能はデフォルトにして、あまり使わない機能はオプションにする」というユーザインターフェイスの定石を踏襲し、あまり使わない機能である属性絞り込みは「検索オプション」という別ページに分離することにしました。Googleなどでもこのような構成はお馴染みのことと思います。

■ 検索オプションの画面
new_search2.png
検索オプションでは、「名前(姓・名・ニックネーム)」だけでなく、名前と自己紹介文を統合した全文検索もできるようにしています。また、「性別」「年齢」「現住所」「出身地」による絞り込みは従来の検索機能から引き継いで持たせています。「血液型」「趣味」「職業」はほとんど使われていないし、実際に有用だとも思わないので、廃止しました。

適合度順表示

従来の検索では、検索結果は、mixiへの登録日の新しい順(実際にはIDの降順)で並べられていました。これもmixiの規模が小さかった時代の名残りで、今や新規登録ユーザだというだけで日記を閲覧したりマイミクシィ申請をしたりする興味の対象になるわけではありません。

友人検索を使う動機は、自分の友人・知人を探して、日記を読んだりメッセージのやりとりをしたりマイミクシィ申請をしたりすることでしょう。あるいは、知らない人であっても、何か共通の話題を持った人に出会ってコミュニケーションを始めることでしょう。

となると、検索操作を行っている人となるべく共通点が多い人を優先的に表示するのが妥当だと考えられます。そこで、自分の住所や出身地が一致するユーザや年齢が近いユーザはポイントを上げるようなスコアシステムを導入しました(もちろん、全体公開されている属性のみを使っています)。また、ログイン時間が近くてコミュニケーションがとりやすい状態にあるユーザもスコアを上げるようにしました。

さらに、マイミクシィのつながりを解析して、自分からのホップ数(自分は0、直接のマイミクは1、マイミクのマイミクは2、マイミクのマイミクのマイミクは3、...)が低いユーザ、すなわち自分と友人ネットワーク的に近いユーザほどスコアが上がるようにもしました。これによって、たとえ「佐藤」「鈴木」「山田」といった一般的な名字で検索したとしても、知人が先頭もしくは1ページ目に表示されてすぐ見つけられる確率は格段に上昇したと思います。Googleにおけるページランクのようなアプローチをmixi上で実装した感じでしょうか。アルゴリズムの基本的な考えかたはマイミクシィレコメンドとほぼ同じですが、今回はオンデマンドで計算していることと3ホップ以上も対象に計算しているところが違います。

■ システム構成イメージ
friendsearchstructure.png

同級生を探してみよう

まず、かんたん友人検索の検索オプションページを開いてください。そこで、検索キーワードの欄の右側のリストボックスで「名前と自己紹介」を選択してください。そして、自分のキーワード入力欄に自分が通っていた中学校や高校などの名前を入れて、「検索する」ボタンを押してください(年齢などの条件は入れない方が探しやすいです)。以下のように二つの単語を「||」で区切る(前後に空白が必要)といわゆるOR検索をすることもできます。
所沢高校 || 所沢高等学校
そうすると、人によっては、いきなり1ページ目に同級生が出てくるかもしれません。何ページか見ればおそらく何人か出てくると思います。もし該当数が多すぎるようならば、自分の年齢の前後1年くらいを指定して絞り込んでみてもよいでしょう。同級生が見つかったらその人とマイミクになってみてもよいでしょう。そうすると、しばらくするとそのマイミクシィ関係が加味されて、さらに同級生が見つけやすくなります。 ギークな技術者の皆様の中には、同級生なんて興味ないという方もいると思います。そんなあなたは、業界用語を使って友人・知人を探してみましょう。例えば以下のような条件はどうでしょう(もちろん、表示される検索結果は人によって異なります)。

インディーズ機能

かんたん友人検索はインディーズ機能としてリリースしました。特にバックエンド(検索エンジンやデータマイニングエンジンやストレージエンジンなど)の研究開発工程を含んだプロジェクトは開発者自身がイニシアティブをとって進めないと明後日の方向に進みがちなわけですが、インディーズ機能として開発できたおかげで今回はかなりうまく仕上がったと思っています。大人の事情によりトップケージからの誘導枠がとても地味になってしまったインディーズ機能ですが、逆境にめげず今後とも模索を続けていこうと思います。

まとめ

「かんたん友人検索」の特徴について説明しました。ユーザインターフェイスをシンプルにして、絞り込むことよりも並び替えをうまくすることで、目的のユーザを探しやすくしています。技術的には、レコメンドと検索の統合を試みたという意味で面白いものになっていると思います。

この機能、単純なようで、裏では結構な工夫を重ねて実現しています。分散処理によって検索や絞り込みを高速化するのはもちろん、検索結果のパーソナライズをオンデマンド(0.01秒程度のレイテンシ)で実現するための工夫も重要です。実装の詳細について書き始めるとものすごく長くなってしまいますので、それは次回の記事にとっておこうと思います。続きを読みたい方は、わっふ(ry