MySQLを通じた全文検索エンジンSenna/groongaの利用について
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 15,539 views

ドワンゴ技術勉強会で発表した際の資料です。

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

Statistics

Views

Total Views
15,539
Views on SlideShare
10,988
Embed Views
4,551

Actions

Likes
10
Downloads
46
Comments
0

13 Embeds 4,551

http://info.dwango.co.jp 2827
http://blog.wktk.co.jp 1590
http://wiki.onakasuita.org 75
http://localhost 20
http://webcache.googleusercontent.com 16
https://twitter.com 6
http://s.deeeki.com 5
http://a0.twimg.com 5
http://paper.li 3
http://translate.googleusercontent.com 1
http://cache.yahoofs.jp 1
http://tsunami.asp 1
http://web.archive.org 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

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