はじめに
こんにちは。検索基盤部の倉澤です。
私たちは、ZOZOTOWNの検索機能の改善に取り組んでいます。ZOZOTOWNには、ユーザーが検索クエリを入力した際に、候補となるキーワードを表示するサジェスト機能があります。
今回はこのサジェスト機能の改善を効率的に評価する社内ツールを以下3点に焦点をあてて紹介します。
- 社内ツールの各機能
- 実務にて利用している場面
- 開発する際に採用したバックエンド技術
背景
ZOZOTOWNでは、サジェストの検索エンジンとしてElasticsearchを採用しています。
Elasticsearchからサジェスト機能がデフォルトで提供されていますが、日本語との相性を考慮し通常の検索クエリを使用して実装しています。
日本語との相性が悪いためサジェスト機能の実装が難しい理由は、Elasticsearch公式ブログの記事で詳しく言及されています。
私たちは、検索クエリに対するサジェスト候補の表示順序のロジックや表記揺れの改善に取り組んでいます。
サジェスト機能の改善を繰り返していくうちに、以下のような要望が出てきました。
- 新たなロジックで作成したサジェストのElasticsearchのインデックスと、既存のインデックスの検索結果にどのような変化があるのかを素早く確認したい
- A/Bテストを実施する前にオフラインの定性評価を実施したい
本ツールはこれらの要望に答えるため作成したものです。
サジェスト評価ツールの機能
上記の背景を踏まえて作成したツールの機能を紹介します。
サジェスト候補の表示
入力として、比較したい2つのElasticsearchのインデックス名、検索クエリを受け取ります。
検索ボタンを押下すると、検索クエリに対応するサジェスト候補がスコアの高い順に10件表示されます。
Elasticsearchでのクエリとドキュメントのマッチングに用いるスコアは、デフォルトのBM25をベースとしたものではなく独自に定義したスコアを用いています。
具体的には、過去のサジェスト候補に対するクリック率やクリック後の商品購入率などを元に計算した重みを使用しています。
また、出力されたサジェスト候補の違いをわかりやすくするため各順位毎に同じキーワードであればグレーアウトしています。
評価
入力した検索クエリに対して、どちらのインデックスが適切な結果を返しているのかを評価する機能を実装しています。また、適切と判断した理由も記録できます。
複数人が同じ2つのインデックスを確認するケースがあります。他の人の評価を元にどちらのインデックスが適切かを総合的に判断したい場合があるため、こちらの評価機能を提供しています。
インデックスを評価するにあたりどのサジェスト候補が適切ではなかったのかを記録するため、各キーワードの横にチェックボックスを用意しています。
評価結果の集計表示
複数人が同一のインデックスを評価するケースがあるので、評価した結果を集計しリアルタイムで表示する機能を提供しています。どのようなクエリを実行しどちらのインデックスが適切であったのかを表示しています。
各インデックス名の列には評価者が検索したクエリ単位に適切だと評価した回数が記録されています。
また、どちらのインデックスも適切だと評価した場合は「both_ok」、どちらのインデックスも適切ではないと評価した場合は「both_ng」の値が記録されます。
これらの集計結果を表示させることで、どのクエリでどのような評価をしたのかを素早く確認できるようになりました。
類似度算出
2つのインデックスから出力されたサジェスト候補を定量的に評価する機能として、類似度を算出し表示しています。
具体的には、「A Similarity Measure for Indefinite Rankings」(著:William Webber, Alistair Moffat and Justin Zobel)の論文で提案されている"Ranking-Biased Overlap(RBO)"という手法により類似度を算出しています。
この手法は類似度を0〜1の範囲で計算し、2つのリスト内の上位のキーワードが異なっていた場合に類似度を大きく減衰させるという特徴があります。
以下の理由からこちらの手法を採用しました。
続きはこちら