この記事はFablic Advent Calendar 2015の21日目のエントリです。
こんにちは、Fablicでサーバーサイドエンジニアをしている@sinamon129です。 今年やった仕事の一つ、フリルの商品検索の精度改善について書こうと思います。
内容は以下の通りです。
商品検索のシステム構成
システム構成は以下の通りです。
- Elasticsearch 1.7.2
- Ruby on Rails
- 使用しているgem searchkick
ちなみに、searchkickはとってもreindexが楽です。特にaliasの張り替えバッチを書く事なくreindexできます。
キーワード検索の精度改善
精度改善とは
現状の検索で、できるだけ関係ないワードが結果に出るのを出ないようにする・関係あるものを出るようにすることを指します。 たとえば、サボで検索した時にサボンが含まれないようにしたり、靴下で検索した時にソックスも含まれるようにしたりすることです。
検索ワードに対して関係のある商品を出すことによって、商品詳細の閲覧やいいね(アクション)を増やし、購入を増やすことを目的としています。
精度改善のために、何をしたか?
nGramベースから形態素解析ベースに変更しました。 そのために以下のことを行いました。
- Elasticsearchのanalyzerの定義を新しく作る
- フリル辞書の作成(辞書・類義語辞書)
- フリル辞書作成システム
- 改善するにあたってみていた指標を一望できる画面の作成
これらの手順に関しては、
に詳しくまとめましたので、そちらをご覧ください。
精度改善前後で見ている指標
改善前後の変化きちんと追うために、これらを確認しながら改善を行いました。
全体
- dau:1日に検索したユニークユーザー数
- count:1日に何回検索されたか
- アクションdau:検索からの商品閲覧
- 一人当たりの1日の検索回数
単語ごと
- dau:1日にその単語単体で検索したユニークユーザー数
- count:1日にその単語単体で何回検索されたか
- アクションdau:検索からの商品閲覧
- アクション率:アクションdau / dau
- hit数:検索結果として出現する商品の数
精度改善後にチェック・していたこと
全体や各ワードのアクション率が下がっていないことをチェックしたり、検索hit数が不本意に減るワードがないかをチェックしていました。 アクション率とhit数が両方下がっている場合、文章がうまく分解できていない場合が多いので、辞書への単語登録が必要となります。 このように登録が必要なワードが見つかったら、辞書に登録してindexを再構築していました。
精度改善して出た効果
- 全く関係ない物が検索結果に出ないようになる
ファー
で検索した時のローリーズファーム
ローファー
など
- 類義語も結果に出るようになる
靴下
で検索した時にソックス
が含まれる物も出る
- 上記によって、アクション率があがる
- 関係ないものが引っかかっていたワードのアクション率が上がる
- 関係ないものが引っかかっていたワードのアクション率が上がる
(おまけ)
- nGramから形態素解析にしたことで、elasticsearchのindex量が減り、パフォーマンスがよくなった
まとめ
精度を改善したかった部分は無事改善することができました。 数字を見ながら改善を行うことにより、リリース基準を決めやすく、出す前後でクリティカルなバグを避けることができたのはよかったです。
また、フリル辞書ができたことにより、辞書データから色々なことができるようになりました。 実際に辞書データ・検索ログデータを活かし、キーワードサジェスト機能を実装しました(本日iOS版でリリースされました!)。
ここからさらに検索体験を改善していきます!!