全文検索In着うた配信サービス

4,425 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,425
On SlideShare
0
From Embeds
0
Number of Embeds
2,821
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

全文検索In着うた配信サービス

  1. 1. 全文検索 IN 着うた配信サービス 研究開発本部 中村智将 1
  2. 2. 自己紹介 中村智将(なかむらともゆき)  新卒入社2年目 twitter: nakamuu 経歴  研修でモバイルサイト検索サービス  社内バグトラッキングシステムの検索機能改造  今ここ→モバイルサイト検索機能担当 2
  3. 3. 今日のテーマ 着うた配信サービスにおける 検索の裏側 Sphinxエンジン複数の条件による絞り込みが高速→着うた検索に適している 3
  4. 4. 目次 着うた配信サービスにおける検索 従来の要件と実装 新たな要件 Senna vs Sphinx Sphinxのさらなるチューニング まとめ 4
  5. 5. 検索機能の役割 着うた購入ページに素早く誘導キーワード検索 着うたカテゴリ検索 5
  6. 6. 多くのユーザを獲得するために 様々な検索条件 楽曲 アーティスト キーワード ドラマ番組名検索 種類(着メロ,着うた,うたフル) 試聴可能 配信サイト 高速なレスポンス 配信開始日 着うた etc... ページ表示1秒 6
  7. 7. 目次 着うた配信サービスにおける検索 従来の要件と実装 新たな要件 Senna vs Sphinx Sphinxのさらなるチューニング まとめ 7
  8. 8. 着うた配信サイト運用の背景 複数サイトの配信を管理 ...etc dwango.jpフル 検索システム 8
  9. 9. 例えばこんな条件で検索させたい 楽曲配信中の番組を検索 10月火曜21時ドラマ 『フリーター、家を買う。』 dwango.jpで主題歌配信中 確かあのドラマで 流れてた曲を探したい ユーザ入力 番組 フリーター 検索システム入力 • 配信しているサイト「dwango.jpフル」 • 素材のジャンル「着うたフル」 9
  10. 10. 従来の実装前提 システム全体でMySQLを使っている 通常の文字列検索 LIKE検索 は遅い MySQL 全文検索 は機能不足 MySQL+独自のParser Plugin 10
  11. 11. MySQL全文検索は機能不足日本語検索ができない スペース区切りでインデックスを生成 日本語はスペース区切りになっていない複数のインデックスを同時に使えない キーワード用インデックス キーワードと数値で 数値用(ID,日付)インデックス 検索すると遅い 11
  12. 12. MySQL+独自のParser Plugin日本語検索ができない キーワード id ごは 1 bigramインデックス はん 1 2文字ずつ区切ってインデックスを作成する複数のインデックスを同時に使えない キーワード id 擬似キーワード genre27 2 数値をキーワードのインデックスに入れる 12
  13. 13. 「擬似キーワード」実践ハイパフォーマンスMySQL第2版pp.648-649より 13
  14. 14. 擬似キーワードを使う 数値とキーワードを1つのインデックスに登録キーワードインデックス番組ID 名前 サイト100で配信かつ1 フリ “フリーター”を含む検索1 リー1 ータ1 ター1 ー、 “フリーター”と”site100”で検索1 site1001 site200 14
  15. 15. 例えばこんな条件で検索させたい 楽曲配信中の番組を検索 10月火曜21時ドラマ 『フリーター、家を買う。』 dwango.jpで主題歌配信中 確かあのドラマで通常のキーワード 流れてた曲を探したい 番組 フリーター 検索 擬似キーワード • 配信しているサイト「site100」 • 素材のジャンル「genre20」 15
  16. 16. 目次 着うた配信サービスにおける検索 従来の要件と実装 新たな要件 Sphinx vs Senna Sphinxのさらなるチューニング まとめ 16
  17. 17. 新たな要件 MySQL+独自のParser Pluginユーザの多様なニーズに応えるためより多くの条件を 組合せて検索させたい 17
  18. 18. 同時に複数の条件を指定楽曲 アーティスト ドラマ番組名 配信サイトキーワード 配信開始日 試聴可能 etc... 実行時間 個数に比例して遅くなる 5個程度で数秒かかる 場合もある 条件組み合わせ個数 18
  19. 19. 最大で15個の条件組み合わせ (従来はたかだか4, 5個) 19
  20. 20. MySQL +独自Parser Plugin の限界 20
  21. 21. 多数の条件を 指定できる全文検索エンジンは ないか? 21
  22. 22. 全文検索エンジン調査 日本語をサポートするオープンソース全文検索エンジンを調査 22
  23. 23. 必要な機能を持つエンジン • 配信日の比較(数値比較)が可能 • MySQLのGROUP BY相当の機能 数値比較が遅い GROUP BYができない MySQLに組み込んで使える 23
  24. 24. インデック 2-gram, space 1-gram, space ス方式 任意の数値絞込み 任意の1カラム 複数カラム 数値絞込みのGROUP BY 任意のカラム カラム運用事例 24
  25. 25. 目次 着うた配信サービスにおける検索 従来の要件と実装 新たな要件 Senna vs Sphinx Sphinxのさらなるチューニング まとめ 25
  26. 26. SennaとSphinxの速度比較 評価方法 検索クエリ単体の実行時間を計測 実験マシン CPU Core2Duo E7500 2.93GHz メモリ 2GB MySQL 5.0.91(Senna) 26
  27. 27. 番組検索テーブル レコード数: 142万件 サイズ: 340MBID 番組名 楽曲ID 素材 配信サイト 作成日 ジャンル 一覧1 さよなら、 3 1 s1 s2 s10 2010/10/10 僕らの夏2 I AM SAM 5 3 s3 s4 s5 2010/09/01... ... ... ... 着うたを配信しているサイト一覧 (擬似キーワード) 27
  28. 28. 実験項目1.全文検索エンジンの基本性能 番組名のみ指定して検索2.OR検索の性能 配信サイトのみ指定して検索3.OR検索とAND検索の組み合わせ 番組名と配信サイトを指定して検索4.実際の検索パターンに近い条件 配信サイト、素材ジャンルを指定して検索 結果をIDでGROUP BY、日付でソート 28
  29. 29. 実験結果(1/4) – 基本速度 検索条件 番組名に”さよなら”を含むヒット件数 1046件 fast slow 0.01未満 0.03 2.73 0.0 0.1 0.2 0.3 [sec] 29
  30. 30. 実験結果(2/4) – OR検索 検索条件 サイト1,2,3,4,5,6,7のいずれかで配信しているヒット件数 806,126件 fast slow 4.60 0.23 0.0 2.0 4.0 6.0 [sec] 30
  31. 31. 実験結果(3/4) – 組み合わせ 番組名に”さよなら”を含み、かつ 検索条件 サイト1,2,3,4,5,6,7のいずれかで配信しているヒット件数 151件 fast slow 2.61 0.13 0.0 2.0 4.0 6.0 [sec] 31
  32. 32. 実験結果(4/4) – 実際のパターン 着(メロ,うた,ボイス)のいずれかが、 検索条件 サイト1,2,3,4,5,6,7のいずれかで配信している 結果をidでGROUP BYして日付で昇順ソートヒット件数 14,429件 fast slow 5.50 0.26 0.0 2.0 4.0 6.0 [sec] 32
  33. 33. 実用的な条件でも0.3秒以内Sphinx採用 33
  34. 34. 目次 着うた配信サービスにおける検索 従来の要件と実装 新たな要件 Senna vs Sphinx Sphinxのさらなるチューニング まとめ 34
  35. 35. キーワードが増えるほど遅くなる 実際に20個以上組み合わせるパターンあり 1.2 1実行時間[sec] 0.8 0.6 0.4 0.2 0 0 10 20 30 OR指定個数 35
  36. 36. 対策:属性インデックス 数値型(int, timestamp)のインデックス キーワードインデックスと共に利用可能 擬似キーワード 属性インデックス ID 番組名 楽曲 素材 素材 ID ジャンル ジャンル 1 アイアンマン 3 g1 1 わざわざ擬似キーワードに変換せず 数値をそのまま使用可能になる 36
  37. 37. 速度比較 属性インデックスのORは遅くならない! 1.2 擬似キーワードで絞り込み 1 属性インデックスで絞り込み実行時間[sec] 0.8 0.6 0.4 0.2 0 0 10 20 30 OR指定個数 37
  38. 38. なぜ遅くならないのか? 38
  39. 39. Sphinxの主要なインデックス 辞書 ドキュメント ヒット位置 属性 39
  40. 40. インデックス参照の流れ(擬似 辞書 ドキュメント ヒット位置)キーワード ①キーワードがヒットするIDを見つける属性イン 属性デックス ②属性インデックスでIDをさらに絞り込む 40
  41. 41. 属性インデックスは常にメモリ上(擬似 辞書 ドキュメント ヒット位置)キーワード属性イン 属性デックス 41
  42. 42. インデックスサイズ(擬似 辞書 ドキュメント ヒット位置)キーワード属性イン 属性デックス 42
  43. 43. チューニングまとめ擬似キーワードによる絞り込み 1キーワードごとにファイル読み込み キーワード数と同じ回数ファイル読み込みが発生属性インデックスによる絞り込み 属性インデックスはメモリ上の値の比較 条件の数が増えても遅くなりにくいインデックスの大部分はHDDに載っている SSD/RAMディスク等でさらに速くなる可能性あり 43
  44. 44. Sphinx最高!! (着うた配信サービスでは) 44
  45. 45. 実運用の中で確認できた罠と対策 現状1-gramのみサポート GROUP BYを行うと合計件数に誤差が生じる 文字列ソートが正しく動かない場合がある 重要なことがドキュメントに書いていない ググるとドキュメンテーションツールの Sphinxがひっかかる 近日公開予定! 45
  46. 46. 目次 着うた配信サービスにおける検索 従来の要件と実装 新たな要件 Senna vs Sphinx Sphinxのさらなるチューニング まとめ 46
  47. 47. まとめ 着うた検索に必要な多数の条件絞り込みは MySQLでは実現が難しい Sphinxで属性インデックスを使うことで 多数の条件でも高速に絞り込み可能 多数の条件が必要になる 検索では、Sphinxが有効 47
  48. 48. Sphinx参考資料 公式サイト  http://sphinxsearch.com/ 実践ハイパフォーマンスMySQL第2版 付録  現状、日本語でまとまった資料はこれだけ Sphinxソースコード  読まないとわからないことが多い 48
  49. 49. おしまい ご清聴ありがとうございました 質問があるんじゃなイカ? 49

×