全文検索 IN 着うた配信サービス
           研究開発本部
            中村智将
                1
自己紹介
 中村智将(なかむらともゆき)
   新卒入社2年目
 twitter: nakamuu
 経歴
   研修でモバイルサイト検索サービス
   社内バグトラッキングシステムの検索機能改造
   今ここ→モバイルサイト検索機能担当



                            2
今日のテーマ
 着うた配信サービスにおける



 検索の裏側

  Sphinxエンジン
複数の条件による絞り込みが高速
→着うた検索に適している
                  3
目次
 着うた配信サービスにおける検索
 従来の要件と実装
 新たな要件
 Senna vs Sphinx
 Sphinxのさらなるチューニング
 まとめ




                      4
検索機能の役割
 着うた購入ページに素早く誘導




キーワード検索



               着うた
カテゴリ検索
                     5
多くのユーザを獲得するために
                      様々な検索条件
              楽曲
     アーティスト
              キーワード
     ドラマ番組名

検索
  種類(着メロ,着うた,うたフル)

      試聴可能    配信サイト
                     高速なレスポンス
      配信開始日           着うた
               etc... ページ表示1秒

                                6
目次
 着うた配信サービスにおける検索
 従来の要件と実装
 新たな要件
 Senna vs Sphinx
 Sphinxのさらなるチューニング
 まとめ




                      7
着うた配信サイト運用の背景
 複数サイトの配信を管理




                  ...etc



    dwango.jpフル   検索システム
                           8
例えばこんな条件で検索させたい
 楽曲配信中の番組を検索     10月火曜21時ドラマ
                 『フリーター、家を買う。』
                 dwango.jpで主題歌配信中
           確かあのドラマで
          流れてた曲を探したい
  ユーザ入力
      番組 フリーター    検索


システム入力
  • 配信しているサイト「dwango.jpフル」
  • 素材のジャンル「着うたフル」
                                9
従来の実装

前提   システム全体でMySQLを使っている



      通常の文字列検索 LIKE検索 は遅い
       MySQL 全文検索 は機能不足




     MySQL+独自のParser Plugin
                              10
MySQL全文検索は機能不足

日本語検索ができない

 スペース区切りでインデックスを生成
 日本語はスペース区切りになっていない

複数のインデックスを同時に使えない
 キーワード用インデックス     キーワードと数値で
 数値用(ID,日付)インデックス 検索すると遅い


                         11
MySQL+独自のParser Plugin

日本語検索ができない          キーワード id
                    ごは    1
     bigramインデックス   はん    1
    2文字ずつ区切ってインデックスを作成する

複数のインデックスを同時に使えない
                    キーワード id
     擬似キーワード        genre27 2
     数値をキーワードのインデックスに入れる

                                12
「擬似キーワード」
実践ハイパフォーマンスMySQL第2版pp.648-649より
                              13
擬似キーワードを使う
 数値とキーワードを1つのインデックスに登録

キーワードインデックス
番組ID   名前        サイト100で配信かつ
1      フリ        “フリーター”を含む検索
1      リー
1      ータ
1      ター
1      ー、        “フリーター”と”site100”で検索
1      site100
1      site200
                                    14
例えばこんな条件で検索させたい
 楽曲配信中の番組を検索      10月火曜21時ドラマ
                  『フリーター、家を買う。』
                  dwango.jpで主題歌配信中
          確かあのドラマで
通常のキーワード 流れてた曲を探したい
       番組 フリーター    検索


 擬似キーワード
   • 配信しているサイト「site100」
   • 素材のジャンル「genre20」
                                 15
目次
 着うた配信サービスにおける検索
 従来の要件と実装
 新たな要件
 Sphinx vs Senna
 Sphinxのさらなるチューニング
 まとめ




                      16
新たな要件


  MySQL+独自のParser Plugin




ユーザの多様なニーズに応えるため
より多くの条件を 組合せて検索させたい
                           17
同時に複数の条件を指定

楽曲   アーティスト   ドラマ番組名    配信サイト

キーワード   配信開始日    試聴可能   etc...


 実行時間   個数に比例して遅くなる
                5個程度で数秒かかる
                場合もある




         条件組み合わせ個数               18
最大で15個の条件
組み合わせ
   (従来はたかだか4, 5個)


               19
MySQL +
独自Parser Plugin
    の限界

              20
多数の条件を
  指定できる
全文検索エンジンは
   ないか?
            21
全文検索エンジン調査
 日本語をサポートする
オープンソース全文検索エンジンを調査




                     22
必要な機能を持つエンジン

  • 配信日の比較(数値比較)が可能
  • MySQLのGROUP BY相当の機能
    数値比較が遅い      GROUP BYができない




         MySQLに組み込んで使える      23
インデック
      2-gram, space   1-gram, space
 ス方式

                      任意の
数値絞込み 任意の1カラム
                      複数カラム

           数値絞込みの
GROUP BY              任意のカラム
           カラム


運用事例

                                      24
目次
 着うた配信サービスにおける検索
 従来の要件と実装
 新たな要件
 Senna vs Sphinx
 Sphinxのさらなるチューニング
 まとめ




                      25
SennaとSphinxの速度比較
 評価方法

  検索クエリ単体の実行時間を計測

 実験マシン

   CPU   Core2Duo E7500 2.93GHz
   メモリ 2GB
   MySQL 5.0.91(Senna)


                                  26
番組検索テーブル
                       レコード数: 142万件
                         サイズ: 340MB

ID   番組名    楽曲ID    素材    配信サイト          作成日
                   ジャンル    一覧
1    さよなら、 3       1      s1 s2 s10   2010/10/10
     僕らの夏
2 I AM SAM 5       3      s3 s4 s5    2010/09/01
... ...    ...            ...

                 着うたを配信しているサイト一覧
                 (擬似キーワード)
                                                   27
実験項目
1.全文検索エンジンの基本性能
  番組名のみ指定して検索
2.OR検索の性能
  配信サイトのみ指定して検索
3.OR検索とAND検索の組み合わせ
   番組名と配信サイトを指定して検索
4.実際の検索パターンに近い条件
  配信サイト、素材ジャンルを指定して検索
  結果をIDでGROUP BY、日付でソート
                          28
実験結果(1/4) – 基本速度

 検索条件   番組名に”さよなら”を含む

ヒット件数 1046件
                 fast         slow
              0.01未満

              0.03
                                            2.73


        0.0    0.1      0.2     0.3 [sec]     29
実験結果(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
実験結果(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
実験結果(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
実用的な条件でも0.3秒以内

Sphinx採用

                 33
目次
 着うた配信サービスにおける検索
 従来の要件と実装
 新たな要件
 Senna vs Sphinx
 Sphinxのさらなるチューニング
 まとめ




                      34
キーワードが増えるほど遅くなる
 実際に20個以上組み合わせるパターンあり
            1.2
             1
実行時間[sec]




            0.8
            0.6
            0.4
            0.2
             0
                  0   10      20   30
                        OR指定個数
                                        35
対策:属性インデックス
 数値型(int, timestamp)のインデックス
  キーワードインデックスと共に利用可能
                      擬似キーワード     属性インデックス

  ID    番組名         楽曲       素材       素材
                     ID   ジャンル      ジャンル
  1    アイアンマン   3         g1        1


       わざわざ擬似キーワードに変換せず
       数値をそのまま使用可能になる
                                           36
速度比較
 属性インデックスのORは遅くならない!
            1.2       擬似キーワードで絞り込み
             1        属性インデックスで絞り込み
実行時間[sec]




            0.8
            0.6
            0.4
            0.2
             0
                  0      10      20   30
                           OR指定個数          37
なぜ遅くならないのか?



          38
Sphinxの主要なインデックス

  辞書        ドキュメント   ヒット位置




       属性


                             39
インデックス参照の流れ
(



擬
似   辞書        ドキュメント   ヒット位置
)




キ
ー
ワ
ー
ド   ①キーワードがヒットするIDを見つける

属
性
イ
ン        属性
デ
ッ
ク
ス    ②属性インデックスでIDをさらに絞り込む      40
属性インデックスは常にメモリ上
(



擬
似   辞書        ドキュメント   ヒット位置
)




キ
ー
ワ
ー
ド

属
性
イ
ン        属性
デ
ッ
ク
ス                              41
インデックスサイズ
(



擬
似   辞書        ドキュメント   ヒット位置
)




キ
ー
ワ
ー
ド

属
性
イ
ン        属性
デ
ッ
ク
ス                              42
チューニングまとめ
擬似キーワードによる絞り込み
 1キーワードごとにファイル読み込み
 キーワード数と同じ回数ファイル読み込みが発生

属性インデックスによる絞り込み
 属性インデックスはメモリ上の値の比較
 条件の数が増えても遅くなりにくい

インデックスの大部分はHDDに載っている
 SSD/RAMディスク等でさらに速くなる可能性あり

                              43
Sphinx
最高!!
  (着うた配信サービスでは)

              44
実運用の中で確認できた罠と対策
 現状1-gramのみサポート
 GROUP BYを行うと合計件数に誤差が生じる
 文字列ソートが正しく動かない場合がある
 重要なことがドキュメントに書いていない
 ググるとドキュメンテーションツールの
 Sphinxがひっかかる


     近日公開予定!
                            45
目次
 着うた配信サービスにおける検索
 従来の要件と実装
 新たな要件
 Senna vs Sphinx
 Sphinxのさらなるチューニング
 まとめ




                      46
まとめ
 着うた検索に必要な多数の条件絞り込みは
  MySQLでは実現が難しい
 Sphinxで属性インデックスを使うことで
 多数の条件でも高速に絞り込み可能


 多数の条件が必要になる
 検索では、Sphinxが有効
                          47
Sphinx参考資料
 公式サイト
  http://sphinxsearch.com/
 実践ハイパフォーマンスMySQL第2版 付録
  現状、日本語でまとまった資料はこれだけ
 Sphinxソースコード
  読まないとわからないことが多い




                              48
おしまい
 ご清聴ありがとうございました


  質問があるんじゃなイカ?




                   49

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