いまさっき思ったこと

あとで読み返したときになにかが生まれるかもしれないし、生まれないかもしれないけど、それはそれでいい

検索プログラムのデフォルトのソート順はどうするべきか

検索のプログラムはむずかしいですよね。

そもそも「ヒット精度のチューニング」が大変です。利用者が検索に使用するキーワードはけっこう表記の揺れがありますので、誤表記に対応したり旧字に対応したり、あるいはtypo(打ちまちがい)に対応しようとするとかなりの手間がかかります。

たとえば「手塚治虫」の「塚」の字は本来はテンがある「塚」ですが、ふつうに変換するとテンなしで表示されるので、両方ともヒットさせなきゃいけません。
ほかにも「赤塚不二夫」の場合、「藤子不二雄」とごっちゃになって、「赤塚不二雄」で検索する人がいるかもしれません。じゃあこれでもヒットするようにしておくか、パソコンやスマホで変換してればこういう表記にはならないから無視していいか、ちょっと悩みます。

じつは「まんがseek」でも「攻城団」でも、こうした表記の揺れを吸収するためにデータベースに「検索キー」という欄を用意して、いくつかの候補を保存しています。
ただこれってあんまり増やしすぎるとなんでもかんでもヒットしちゃうので、検索結果にノイズが増えるというジレンマがあります。

で、より重要になってくるのがソート(並び順)になるわけです。

デフォルトのソート順はどうするべきか

正解はサイトごとにちがうはずですが、サイトのカテゴリーによってある程度は決まるのかもしれません。

ECサイトなら「売れてる順」でしょうか。でもこれは新発売の商品が不利になりますね。「一定期間内に売れた個数(あるいは注文者数)の多い順」にするとちょっとはましになるかもしれません。さらに新商品の場合はちょっとだけゲタをはかせる(10個くらい売れたことにする)と有利不利も是正されるかもしれません。

じゃあ飲食店の検索とか、「攻城団」のようにお城の検索だとどうでしょうか。
スマホでの検索の場合は、「現在地から近い順」というのは悪くないかもしれませんが、いち利用者として考えると(値段が大差ないなら)100m以内にあるいまいちな店よりも、300m先にあるうまい店のほうがいいわけで、単純に距離順に出すのはまずそうです。

コンジョイント分析などをもとにして、スコア化するというのもいいですね。
しかもユーザー登録すれば許容できる距離とか、優先したい項目(たとえばコスパとか、テーブルの広さとか)に重み付けできたらなおいいかもしれません。

でも考えたいのはデフォルトのソート順です。
ユーザー登録とかはここでは考慮しないことにします。

ソートは提案

あるキーワードで候補が10件見つかった場合、それをどの順番で表示するべきか。

じつは「攻城団」ではぼくが個々のお城におもいっきり主観で割り振った「知名度」という数字を元に並べています。

知名度は10段階で、「姫路城」のようにほとんどの人が知ってるお城には10点を、天守はあるけど史実に基づかないなんちゃっての場合は6点、Wikipediaにも載ってないようなマイナーなお城には4点、といった感じである程度の基準を定めつつ、ぼくの感覚で微調整してつけています。

一度つけたらそのまんまじゃなく、ニュースで話題になったり、ドラマやマンガに登場したら修正を加えています。
たとえば雲海で有名になった竹田城は当初「7」でしたが、現在は「9」になってます。

これは個人的にはちょっとした発見でした。
ソートに使う適切なデータがないならつくっちゃえばいいと。けっきょく検索する方は(確率的には)メジャーなお城をさがしていることが多いわけですしね。

ソートというのは「あなたが探しているのはこれですよね?」という提案なので、それに近づくためにもっとも有効なデータはなにか考えることが大事です。

ただこれはお城のように数が比較的少ないからこそできるのも事実です。
ラーメン屋で同じことをやるのはさすがにむりでしょうしね。

知名度だけじゃダメだった

でもこれでは不完全でした。
上述したとおり、これはあくまでも「確率的に」妥当性を高めているだけで、過半数くらいの方のニーズを見たせているものの(ID順のように無意味なデータでソートするよりはるかにいいですし、過半数を満たせてるならそれで十分という考えもありますが)、もうちょっと改善の必要があるなと思ってました。

というか自分で使ってて不満があったのです。

結論をいえば、検索キーワードと完全一致したデータがあれば、ほかのものより(攻城団の場合でいうと知名度で負けていても)優先的に表示するようにしました。

以下のキャプチャは今回修正したあとの検索結果の画面です。

f:id:takeshi:20151221135500p:plain

2番目に表示されている鹿児島県松山城Wikipediaにもページがないお城で、知名度的には「4」となっています。
だから通常ならもっと下に表示されるのですが、検索キーワードと同じ名前ということで上位表示しています。

仕組みとしては裏側で検索する回数を1回増やしているので(完全一致のデータがあるかという検索が増えた)、負荷は前よりかかってるんですけど、それでも得られる成果と比べれば軽微なものだと判断しました。

細かいことは攻城団のほうのブログに書いています。

検索してヒットしないと利用者からは「データがない」と思われてしまうため、どうしても「より多くヒットさせる」方向で考えてしまいます。
これはしょうがないですよね。

そうして網を広げて、たくさんのデータがヒットした場合に、利用者がほんとうに探していたもの、見つけたかったものをいかに返してあげられるかは、それこそGoogleが何度も試行錯誤を重ねながら、人もお金もいっぱい使って取り組んでることで、ぼくらがちょこちょこっとやったところでたかが知れています。

でも「攻城団」ならお城、「まんがseek」ならマンガといった感じで、検索対象のデータがあるテーマに絞られていて、それなりに構造化されているというのはGoogleよりも恵まれた条件です。

小手先の対応でもけっこう便利に改善できるかもしれないなあと今回思いました。
またなにか思いついたら試してみます。

ほかにもいいアイデアがあればぜひ教えてください!

おもしろき こともなき世を おもしろく すみなしものは 心なりけり