MySQLを通じた全文検索エンジンSenna/groongaの利用について

15,903 views
15,720 views

Published on

ドワンゴ技術勉強会で発表した際の資料です。
詳細は、ドワンゴ研究開発ブログ( http://info.dwango.co.jp/rd/ )を参照ください。

Published in: Technology
0 Comments
12 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
15,903
On SlideShare
0
From Embeds
0
Number of Embeds
4,682
Actions
Shares
0
Downloads
52
Comments
0
Likes
12
Embeds 0
No embeds

No notes for slide

MySQLを通じた全文検索エンジンSenna/groongaの利用について

  1. 1. MySQLを通じた 全⽂検索エンジン Senna/groonga の利⽤について(有)未来検索ブラジル・(株)wktk 末永 匡 a.k.a. グニャラくん Twitter: @tasukuchan ニコニコミュニティ: co11704 1
  2. 2. 未来検索ブラジルとドワンゴ• お招きいただきありがとうございます• 古くから取引関係あり、ニワンゴに出資• ブラジルでの初仕事は、ドワンゴ着メロ 全⽂検索システムのコンサルティング 2
  3. 3. 勉強会も終盤です• 真⾯⽬に聴講しているひと – 集中していて、すでに疲れて眠い• 真⾯⽬に聴講していないひと – そもそも眠い 結論 : 全員眠い 3
  4. 4. 気楽に聞いてください 4
  5. 5. ⾃⼰紹介 (1)• (有)未来検索ブラジルにて、「2ちゃんね る検索」や「ニコニコ⼤百科」の開発に 従事• 「グニャラくん」という名前で活動• (株)wktkというペーパーカンパニーの 代表 5
  6. 6. ⾃⼰紹介 (2) (参考)⿃居みゆっき グニャラくん 某社会⻑ 15歳 2倍! 30歳 42歳 6
  7. 7. 検索にまつわる背景• いわゆるCGMの台頭 – ニコニコ動画 – 2ちゃんねる – Twitter – Wikipedia – etc…• これらに共通する特徴は… 7
  8. 8. CGMに対応した検索エンジン• CGMに共通する特徴 – 頻繁な更新・常時更新 – 巨⼤な⽂書量 対応した検索エンジンが求められる 8
  9. 9. 頻繁な更新・常時更新• コンテンツが頻繁かつ常に更新される• 更新されたものをすぐに検索したい!と いうニーズ – 2ちゃんねるにおける地震関係の掲⽰板 – 地震直後に検索したい!• ⽂書の追加更新が低速だったり、不可能 である検索エンジンは不向き 更新が⾼速なエンジンが求められる 9
  10. 10. 巨⼤な⽂書量• ⽂書量がとっても多い! – 頻繁な更新・常時更新の結果 – ユーザが、⾃分が⾒たいコンテンツにたどり 着くことが困難 – コンテンツ選択⼿段として検索のニーズが⾼ まる• 「京都」で検索して「東京都」が検索対 象となるような検索エンジンは不向き 精度が⾼い検索エンジンが求められる 10
  11. 11. CGMに対応するためには?• CGMに共通する特徴 – 頻繁な更新・常時更新 – 巨⼤な⽂書量 鮮度・精度の⾼い検索エンジン 11
  12. 12. 発表の流れ• 検索エンジンにおける基本性能の尺度に ついて解説• Sennaについて紹介• groonga開発の経緯• groongaについて紹介検索エンジンの性能はどう評価するの? 12
  13. 13. 検索エンジンにおける基本性能の尺度• 検索速度• 更新速度• ⽂書容量• 適合率• 再現率 5つの尺度がある! 13
  14. 14. 検索速度と更新速度• 検索速度 – 検索応答時間/検索スループット – 主にユーザの待ち時間に影響する• 更新速度 – ⽂書の新規作成時における処理速度 – 既存⽂書の更新・削除時における処理速度 – 主に検索結果の鮮度に影響する 14
  15. 15. 検索エンジンのアルゴリズム• 逐次検索⽅式(grep/LIKE検索)• シグネチャ⽅式• 接尾辞配列⽅式• 索引検索⽅式 15
  16. 16. 逐次検索⽅式• 対象⽂書を逐次スキャンする – grepやSQLのLIKE条件と同様 – 検索時に⽂書本体のみあればよい • インデックスなどの余分なデータが必要ない• 更新速度:⾼ – インデックス等を作成しないため• 検索速度:低 – データを逐次スキャンするため 16
  17. 17. 索引検索⽅式• ある単語が、どの⽂書にあるかを保持 – 「転置インデックス」というデータ構造 – (例) 書籍巻末にある⽤語索引 検索対象語 ⽂書番号列 インド 1, 10, 12 インドア 5, 10, 11 インドネシア 10• 更新速度:低• 検索速度:⾼ 17
  18. 18. 各種⽅式の特徴検索速度と更新速度はトレードオフ関係 18
  19. 19. まとめ:検索速度と更新速度のトレードオフ• 検索速度と更新速度にはトレードオフ関 係がある – 逐次検索⽅式 • 検索速度 : 低 • 更新速度 : ⾼ – 索引検索⽅式 • 検索速度 : ⾼ • 更新速度 : 低• 今⽇は、索引検索⽅式(転置インデック スの利⽤)を前提としてお話します 19
  20. 20. ⽂書容量/適合率/再現率• ⽂書容量 – どれくらいの⽂書量を扱えるか• 適合率 – 「検索ノイズ」がどのくらい少ないか • 「先⽣」で「この先⽣きのこる」が検索• 再現率 – 「検索漏れ」がどのくらい少ないか • 「腐向けAPH」で「腐/向/け/A/P/H 」が検索• 両者はトレードオフ関係にある 20
  21. 21. まとめ : 全⽂検索の基礎について• 検索エンジンにおける基本性能の尺度 – 検索速度, 更新速度, ⽂書容量, 適合率, 再現率• 上記尺度間はトレードオフ関係• どの尺度を重視するかによって、検索エ ンジンの設計が決まる – (例)鮮度と精度を重視 : 更新速度と適合率を重視 21
  22. 22. 22
  23. 23. 発表の流れ• 検索エンジンにおける基本性能の尺度に ついて解説• Sennaについて紹介• groonga開発の経緯• groongaについて紹介Sennaはどんな性能尺度を重視してるの? 23
  24. 24. 全⽂検索エンジンSenna http://qwik.jp/senna/ 24
  25. 25. Senna• (有)未来検索ブラジルを中⼼に開発されて いた全⽂検索エンジン• オープンソースライセンス(LGPL) – 無償で商⽤利⽤可• 現在はメンテナンスフェーズ 25
  26. 26. Sennaの三⼤特徴• ⾼速• ⾼精度• ⾼柔軟性• 順に説明していきます 26
  27. 27. ⾼速• 検索が⾼速 – 転置インデックスを採⽤ – ⾼速な検索ができる• 更新が⾼速 – 既存インデックスへの追加・変更が⾼速 – 鮮度の⾼い情報をインデックス化できる ⾼速化には実装上の⼯夫が不可⽋ 27
  28. 28. ⾼速化の⼯夫• 転置インデックスに適したバッファ機構 – インデックスの⼀部をメモリにキャッシュ – I/O負荷の減少• 検索時インデックスの排他制御が不要 – ⾼い並列性• インデックス⾃動再配置(=デフラグ) – インデックスの不要な領域を再配置 – 更新・削除による性能劣化を防ぐ ⾼速な更新・検索を志向した実装 28
  29. 29. ⾼精度• Sennaは精度重視の設計 – 速度は、精度を阻害しない範囲で追求• 具体的には – 1. 適合率 – 2. 再現率 の順番で重視⼤規模なコンテンツを対象とした検索では、 適合率が重要となるため 29
  30. 30. 適合率と再現率の両⽴• 適合率と再現率はトレードオフの関係 – どちらも⾼いほうがよい• Sennaでは両尺度を⾼める⽅式を採⽤ – 形態素の部分⼀致検索が可能なデータ構造 – 「京都」で検索して「東京都」を含む⽂書が 検索可能 (詳細は省く) 30
  31. 31. ⾼柔軟性• RDBMS組み込み – SQLを⽤いた全⽂検索問い合わせが可能• MySQL + Senna = Tritonn• PostgreSQL + Senna = textsearch_senna 31
  32. 32. 書誌情報の重要性• 書誌情報 : ⽂書に付随した各種情報のこと• 実⽤上の要求 – ⽂書作成⽇で並べ替えて表⽰したい – ⾮公開フラグが⽴っている⽂書を除きたい – タイトルに検索語が登場するものを、内容の みに検索語が登場するものより優先的に表⽰ したい RDBMS/SQLはこれらの要求を満たす 32
  33. 33. Tritonn : MySQL + Senna• MySQLが⽂書と書誌情報を管理• SQLの⾼い記述⼒ = ⾼柔軟性 – 複雑な問い合わせが可能 – 他カラムでの絞り込み・並び替え・グループ 化 33
  34. 34. Tritonnのクエリ例• (例) 全⽂検索を⾏い、なおかつ、最終更新⽇が ある⽇を超えるレコード群を取得• SELECT * FROM table1 WHERE MATCH(body) AGAINST(‘クエリ’) AND last_update > 2010/01/31; SQLを⽤いた柔軟な検索 34
  35. 35. 以上がSennaの三⼤特徴でした• ⾼速• ⾼精度• ⾼柔軟性 35
  36. 36. 36
  37. 37. 発表の流れ• 検索エンジンにおける基本性能の尺度に ついて解説• Sennaについて紹介• groonga開発の経緯• groongaについて紹介 Sennaでは実現できなかったことは? 37
  38. 38. groonga開発の経緯• Sennaは、MySQL経由で使われる (=Tritonnの利⽤)が多かった その功罪があった 38
  39. 39. Tritonnのよいところ• MySQLの資産が使える – ⼈的資産(エンジニア) – 物的資産(ソフトウェア)• SQLを⽤いた柔軟なクエリが書ける 悪いところもあった 39
  40. 40. Tritonnの悪いところ• 更新が遅い!• 更新時に、検索スループットが悪い!• 書誌情報を⽤いた絞込み・ソート・グ ループ化が遅い「⾼速な更新・検索」をうたっていたのに? 40
  41. 41. どうしてこうなった 41
  42. 42. Tritonnの仕組み• MySQLはストレージエンジンというデー タ保存部分を選択できる – MyISAM – InnoDB• TritonnはMyISAMの全⽂検索を置換 – ⽂章の本⽂や書誌情報をMyISAMに保存 MyISAM利⽤時のみ全⽂検索可能 42
  43. 43. MyISAMとテーブルロック• MyISAMはテーブル単位でロックを⾏う – 更新スループットの低下 – 更新時に、検索を阻害• Sennaの「⾼速な更新」 – ロックフリーなデータ構造 – データ更新時に検索を阻害しない ムジュン! 43
  44. 44. 書誌情報を⽤いた検索時のロス• 書誌情報を⽤いた検索時に、MySQLのイ ンデックスなどがうまく使われない – Sennaで検索した結果 0.01sec – MySQLで書誌情報のカラムをロード、それ を⽤いた絞込み・ソート・グループ化 2.xx sec互いの持っている⾼速化機構を⽣かし切れない 44
  45. 45. めざせTritonn越え• TritonnではSennaの設計特性を活かす ことが出来なかった。設計特性を活かした検索エンジンの開発へ 45
  46. 46. そこで開発したのが… 46
  47. 47. あから2010 47
  48. 48. 間違えた…http://groonga.org/ 48
  49. 49. 発表の流れ• 検索エンジンにおける基本性能の尺度に ついて解説• Sennaについて紹介• groonga開発の経緯• groongaについて紹介 groongaはどんな検索エンジンなの? 49
  50. 50. groonga• groonga.orgにおいて開発されていた全 ⽂検索エンジン• オープンソースライセンス(LGPL) – 無償で商⽤利⽤可 50
  51. 51. groongaの特徴• 書誌情報も管理・保存 – MyISAMに依存しない• groonga単体で全⽂検索可能 – MySQLそのものに依存しない 「⾼速な更新」を活かす 51
  52. 52. groongaの利⽤形態• groonga単体 – ネットワークサーバ – コマンドライン• groongaライブラリ – C⾔語 – Ruby 52
  53. 53. ネットワークサーバ• 対応プロトコル – HTTP GET – memcached バイナリプロトコル – 独⾃プロトコル – MessagePack(未実装)• HTTP経由では、管理ツールが利⽤でき る – phpMyAdminみたいなもの 53
  54. 54. クエリ⾔語• クエリの実⾏系を搭載 – 条件はJavaScriptライクな⽂法 – 結果はJSON(P)/XML/CSV – ソートや絞込みもできるよ!• 例: http://server/d/select.json?table=t able1&filter=body @ クエリ && last_update > 2010/01/31 &offset=0&limit=5&callback=func 54
  55. 55. その他の特徴• ドリルダウン(ファセット)• ジオサーチ(地理情報検索)• サジェスト(検索キーワード候補の提案) 55
  56. 56. ドリルダウン• 検索結果を、特定のカラムでグループ化 – GROUP BY• (例)サイト横断検索、件数の降順でソート – dwango.jp ☆取放題DX (232) – dwango.jp うた (130) – dwango.jp フル (65) – dwango.jp コール (32) – dwango.jp ボイス (13) 56
  57. 57. ジオサーチ• 地理情報の検索 – ある地点からの距離計算 – ある地点を中⼼とした円内にあるかどうか – ある2点で定義される矩形内にあるかどうか – 楕円体としてきちんと計算してるよ!• ⽇本測地系/世界測地系両対応• インデックスを⽤いて⾼速に検索可能 57
  58. 58. サジェスト• ユーザの検索クエリログを収集 – 検索フォームに⼊⼒された⽂字を、途中経過 を含めてすべてログ収集• 上記ログを解析し、オススメのクエリを 提案する – 提案 (「全⽂検索」→「groonga」) – 訂正 (「gloonga」→「groonga」) – 補完 (「gro」→「groonga」) 58
  59. 59. groongaすげー• MySQLにもう頼らないよ!• 更新速度も上がったよ!• いろんな機能があるよ! あ、あれ… 59
  60. 60. あ、あれ!?…• 本⽇のテーマは、MySQLのプラグインMySQL経由でもgroongaを使いたい! 60
  61. 61. MySQL経由で使いたい• groongaストレージエンジン (mroonga) – MySQL + groonga – MyISAMそのものを置換する 更新・検索性能の問題を回避 61
  62. 62. Sphinxとの⽐較• MySQLのストレージエンジンとして検索 が可能。• version 0.9.9からは、MySQLのプロト コルを直接理解し、SphinxQLという SQLのサブセットで検索ができる。 groongaストレージエンジン は前者 62
  63. 63. 分散構成• 直接のソリューションは現在ない – アプリケーション側での分散• groongaストレージエンジン + SPIDER ストレージエンジンMySQL経由で、しかも分散構成で利⽤可能 63
  64. 64. ドキュメント• 詳細な特徴は http://groonga.org/docs/• チュートリアルを⼀通りこなすと、だい たいの機能の使い⽅が分かる…はず 64
  65. 65. 導⼊事例• groongaデーモン – 某Webサイトでのアイテム検索• groongaライブラリ(Ruby) – 某番組情報サイトの検索 – buzztter 商⽤・⾼負荷サイトでの導⼊実績あり 65
  66. 66. 注意点• 64bit専⽤ – OSの仮想メモリ機構を最⼤限に利⽤• ファイルディスクリプタMAXあげる – カラムごとに1ファイル – ネットワークサーバも兼⽤• groongaストレージエンジンは、まだ Tritonnの域に達していない。2010/12/29リリースで改善したいところ 66
  67. 67. まとめ (1)• groongaは、Sennaの特徴である「⾼速 な更新」を真に実現するために書かれた 全⽂検索エンジンである。• groongaを、MySQLのストレージエン ジンとして使うことができる。 67
  68. 68. まとめ (2)• ためしに使ってミルノデス• 開発者募集中!! バグ報告募集中!!• ブラジルでは検索エンジニアを⼤募集中 です!! 68
  69. 69. Thank you! 69

×