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

69
1 MySQLを通じた 全文検索エンジン Senna/groonga の利用について (有)未来検索ブラジル・(株)wktk 末永 a.k.a. グニャラくん Twitter: @tasukuchan ニコニコミュニティ: co11704

description

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

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

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

1

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

(有)未来検索ブラジル・(株)wktk末永 匡 a.k.a. グニャラくんTwitter: @tasukuchan

ニコニコミュニティ: co11704

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

未来検索ブラジルとドワンゴ• お招きいただきありがとうございます• 古くから取引関係あり、ニワンゴに出資• ブラジルでの初仕事は、ドワンゴ着メロ全文検索システムのコンサルティング

2

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

勉強会も終盤です• 真面目に聴講しているひと

‒ 集中していて、すでに疲れて眠い• 真面目に聴講していないひと

‒ そもそも眠い

3

結論 : 全員眠い

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

気楽に聞いてください

4

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

5

自己紹介 (1)• (有)未来検索ブラジルにて、「2ちゃんねる検索」や「ニコニコ大百科」の開発に従事

• 「グニャラくん」という名前で活動• (株)wktkというペーパーカンパニーの代表

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

6

自己紹介 (2)

鳥居みゆっき グニャラくん30歳15歳 42歳

某社会長2倍!

(参考)

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

7

検索にまつわる背景• いわゆるCGMの台頭

‒ ニコニコ動画‒ 2ちゃんねる‒ Twitter‒ Wikipedia‒ etc…

• これらに共通する特徴は…

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

8

CGMに対応した検索エンジン• CGMに共通する特徴

‒ 頻繁な更新・常時更新‒ 巨大な文書量

対応した検索エンジンが求められる

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

9

頻繁な更新・常時更新• コンテンツが頻繁かつ常に更新される• 更新されたものをすぐに検索したい!というニーズ‒ 2ちゃんねるにおける地震関係の掲示板‒ 地震直後に検索したい!

• 文書の追加更新が低速だったり、不可能である検索エンジンは不向き

更新が高速なエンジンが求められる

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

10

巨大な文書量• 文書量がとっても多い!

‒ 頻繁な更新・常時更新の結果‒ ユーザが、自分が見たいコンテンツにたどり着くことが困難

‒ コンテンツ選択手段として検索のニーズが高まる

• 「京都」で検索して「東京都」が検索対象となるような検索エンジンは不向き

精度が高い検索エンジンが求められる

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

11

CGMに対応するためには?• CGMに共通する特徴

‒ 頻繁な更新・常時更新‒ 巨大な文書量

鮮度・精度の高い検索エンジン

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

12

発表の流れ• 検索エンジンにおける基本性能の尺度について解説

• Sennaについて紹介• groonga開発の経緯• groongaについて紹介

検索エンジンの性能はどう評価するの?

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

13

検索エンジンにおける基本性能の尺度

•検索速度•更新速度• 文書容量•適合率•再現率

5つの尺度がある!

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

14

検索速度と更新速度• 検索速度

‒ 検索応答時間/検索スループット‒ 主にユーザの待ち時間に影響する

• 更新速度‒ 文書の新規作成時における処理速度‒ 既存文書の更新・削除時における処理速度‒ 主に検索結果の鮮度に影響する

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

15

検索エンジンのアルゴリズム•逐次検索方式(grep/LIKE検索)• シグネチャ方式• 接尾辞配列方式• 索引検索方式

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

16

逐次検索方式• 対象文書を逐次スキャンする

‒ grepやSQLのLIKE条件と同様‒ 検索時に文書本体のみあればよい

•インデックスなどの余分なデータが必要ない• 更新速度:高

‒ インデックス等を作成しないため• 検索速度:低

‒ データを逐次スキャンするため

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

17

索引検索方式• ある単語が、どの文書にあるかを保持

‒ 「転置インデックス」というデータ構造‒ (例) 書籍巻末にある用語索引

• 更新速度:低• 検索速度:高

検索対象語 文書番号列インド 1, 10, 12インドア 5, 10, 11

インドネシア 10

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

18

各種方式の特徴

検索速度と更新速度はトレードオフ関係

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

19

まとめ:検索速度と更新速度のトレードオフ

• 検索速度と更新速度にはトレードオフ関係がある‒ 逐次検索方式

•検索速度 : 低•更新速度 : 高

‒ 索引検索方式•検索速度 : 高•更新速度 : 低

• 今日は、索引検索方式(転置インデックスの利用)を前提としてお話します

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

20

文書容量/適合率/再現率

• 文書容量‒ どれくらいの文書量を扱えるか

•適合率‒ 「検索ノイズ」がどのくらい少ないか•「先生」で「この先生きのこる」が検索

•再現率‒ 「検索漏れ」がどのくらい少ないか

•「腐向けAPH」で「腐/向/け/A/P/H 」が検索•両者はトレードオフ関係にある

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

21

まとめ : 全文検索の基礎について• 検索エンジンにおける基本性能の尺度‒ 検索速度, 更新速度, 文書容量, 適合率, 再現率

•上記尺度間はトレードオフ関係•どの尺度を重視するかによって、検索エンジンの設計が決まる‒ (例)鮮度と精度を重視 :更新速度と適合率を重視

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

22

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

23

発表の流れ• 検索エンジンにおける基本性能の尺度について解説

• Sennaについて紹介• groonga開発の経緯• groongaについて紹介

Sennaはどんな性能尺度を重視してるの?

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

24

全文検索エンジンSenna

http://qwik.jp/senna/

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

25

Senna• (有)未来検索ブラジルを中心に開発されていた全文検索エンジン

• オープンソースライセンス(LGPL)‒ 無償で商用利用可

• 現在はメンテナンスフェーズ

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

26

Sennaの三大特徴• 高速• 高精度• 高柔軟性

• 順に説明していきます

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

27

高速• 検索が高速

‒ 転置インデックスを採用‒ 高速な検索ができる

• 更新が高速‒ 既存インデックスへの追加・変更が高速‒ 鮮度の高い情報をインデックス化できる

高速化には実装上の工夫が不可欠

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

28

高速化の工夫• 転置インデックスに適したバッファ機構

‒ インデックスの一部をメモリにキャッシュ‒ I/O負荷の減少

• 検索時インデックスの排他制御が不要‒ 高い並列性

• インデックス自動再配置(=デフラグ)‒ インデックスの不要な領域を再配置‒ 更新・削除による性能劣化を防ぐ

高速な更新・検索を志向した実装

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

29

高精度• Sennaは精度重視の設計

‒ 速度は、精度を阻害しない範囲で追求• 具体的には

‒ 1. 適合率‒ 2. 再現率の順番で重視

大規模なコンテンツを対象とした検索では、適合率が重要となるため

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

30

適合率と再現率の両立• 適合率と再現率はトレードオフの関係

‒ どちらも高いほうがよい• Sennaでは両尺度を高める方式を採用

‒ 形態素の部分一致検索が可能なデータ構造‒ 「京都」で検索して「東京都」を含む文書が検索可能 (詳細は省く)

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

31

高柔軟性• RDBMS組み込み

‒ SQLを用いた全文検索問い合わせが可能• MySQL + Senna = Tritonn• PostgreSQL + Senna = textsearch_senna

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

32

書誌情報の重要性• 書誌情報 : 文書に付随した各種情報のこと• 実用上の要求

‒ 文書作成日で並べ替えて表示したい‒ 非公開フラグが立っている文書を除きたい‒ タイトルに検索語が登場するものを、内容のみに検索語が登場するものより優先的に表示したい

RDBMS/SQLはこれらの要求を満たす

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

33

Tritonn : MySQL + Senna• MySQLが文書と書誌情報を管理• SQLの高い記述力 = 高柔軟性

‒ 複雑な問い合わせが可能‒ 他カラムでの絞り込み・並び替え・グループ化

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

34

Tritonnのクエリ例• (例) 全文検索を行い、なおかつ、最終更新日がある日を超えるレコード群を取得

• SELECT * FROM table1WHERE MATCH(body)AGAINST(‘クエリ’)ANDlast_update > '2010/01/31';

SQLを用いた柔軟な検索

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

35

以上がSennaの三大特徴でした•高速•高精度•高柔軟性

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

36

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

37

発表の流れ• 検索エンジンにおける基本性能の尺度について解説

• Sennaについて紹介• groonga開発の経緯• groongaについて紹介

Sennaでは実現できなかったことは?

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

groonga開発の経緯• Sennaは、MySQL経由で使われる(=Tritonnの利用)が多かった

38

その功罪があった

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

39

Tritonnのよいところ• MySQLの資産が使える

‒ 人的資産(エンジニア)‒ 物的資産(ソフトウェア)

• SQLを用いた柔軟なクエリが書ける

悪いところもあった

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

40

Tritonnの悪いところ• 更新が遅い!• 更新時に、検索スループットが悪い!• 書誌情報を用いた絞込み・ソート・グループ化が遅い

「高速な更新・検索」をうたっていたのに?

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

41

どうしてこうなった

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

42

Tritonnの仕組み• MySQLはストレージエンジンというデータ保存部分を選択できる‒ MyISAM‒ InnoDB

• TritonnはMyISAMの全文検索を置換‒ 文章の本文や書誌情報をMyISAMに保存

MyISAM利用時のみ全文検索可能

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

43

MyISAMとテーブルロック• MyISAMはテーブル単位でロックを行う

‒ 更新スループットの低下‒ 更新時に、検索を阻害

• Sennaの「高速な更新」‒ ロックフリーなデータ構造‒ データ更新時に検索を阻害しない

ムジュン!

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

書誌情報を用いた検索時のロス• 書誌情報を用いた検索時に、MySQLのインデックスなどがうまく使われない‒ Sennaで検索した結果0.01sec

‒ MySQLで書誌情報のカラムをロード、それを用いた絞込み・ソート・グループ化2.xx sec

44

互いの持っている高速化機構を生かし切れない

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

45

めざせTritonn越え• TritonnではSennaの設計特性を活かすことが出来なかった。

設計特性を活かした検索エンジンの開発へ

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

そこで開発したのが…

46

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

47

あから2010

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

48

間違えた…

http://groonga.org/

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

49

発表の流れ• 検索エンジンにおける基本性能の尺度について解説

• Sennaについて紹介• groonga開発の経緯• groongaについて紹介

groongaはどんな検索エンジンなの?

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

50

groonga• groonga.orgにおいて開発されていた全文検索エンジン

• オープンソースライセンス(LGPL)‒ 無償で商用利用可

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

51

groongaの特徴• 書誌情報も管理・保存

‒ MyISAMに依存しない• groonga単体で全文検索可能

‒ MySQLそのものに依存しない

「高速な更新」を活かす

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

52

groongaの利用形態• groonga単体

‒ ネットワークサーバ‒ コマンドライン

• groongaライブラリ‒ C言語‒ Ruby

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

53

ネットワークサーバ• 対応プロトコル

‒ HTTP GET‒ memcached バイナリプロトコル‒ 独自プロトコル‒ MessagePack(未実装)

• HTTP経由では、管理ツールが利用できる‒ phpMyAdminみたいなもの

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

54

クエリ言語• クエリの実行系を搭載

‒ 条件はJavaScriptライクな文法‒ 結果はJSON(P)/XML/CSV‒ ソートや絞込みもできるよ!

• 例:http://server/d/select.json?table=table1&filter=body @ 'クエリ' && last_update > '2010/01/31' &offset=0&limit=5&callback=func

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

55

その他の特徴• ドリルダウン(ファセット)• ジオサーチ(地理情報検索)• サジェスト(検索キーワード候補の提案)

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

56

ドリルダウン• 検索結果を、特定のカラムでグループ化

‒ GROUP BY• (例)サイト横断検索、件数の降順でソート

‒ dwango.jp ☆取放題DX (232)‒ dwango.jp うた (130)‒ dwango.jp フル (65)‒ dwango.jp コール (32)‒ dwango.jp ボイス (13)

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

57

ジオサーチ• 地理情報の検索

‒ ある地点からの距離計算‒ ある地点を中心とした円内にあるかどうか‒ ある2点で定義される矩形内にあるかどうか‒ 楕円体としてきちんと計算してるよ!

• 日本測地系/世界測地系両対応• インデックスを用いて高速に検索可能

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

58

サジェスト• ユーザの検索クエリログを収集

‒ 検索フォームに入力された文字を、途中経過を含めてすべてログ収集

• 上記ログを解析し、オススメのクエリを提案する‒ 提案 (「全文検索」→「groonga」)‒ 訂正 (「gloonga」→「groonga」)‒ 補完 (「gro」→「groonga」)

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

groongaすげー• MySQLにもう頼らないよ!• 更新速度も上がったよ!• いろんな機能があるよ!

59

あ、あれ…

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

あ、あれ!?…• 本日のテーマは、MySQLのプラグイン

60

MySQL経由でもgroongaを使いたい!

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

61

MySQL経由で使いたい• groongaストレージエンジン(mroonga)‒ MySQL + groonga‒ MyISAMそのものを置換する

更新・検索性能の問題を回避

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

62

Sphinxとの比較• MySQLのストレージエンジンとして検索が可能。

• version 0.9.9からは、MySQLのプロトコルを直接理解し、SphinxQLというSQLのサブセットで検索ができる。

groongaストレージエンジンは前者

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

63

分散構成• 直接のソリューションは現在ない

‒ アプリケーション側での分散• groongaストレージエンジン + SPIDERストレージエンジン

MySQL経由で、しかも分散構成で利用可能

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

64

ドキュメント• 詳細な特徴はhttp://groonga.org/docs/

• チュートリアルを一通りこなすと、だいたいの機能の使い方が分かる…はず

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

65

導入事例• groongaデーモン

‒ 某Webサイトでのアイテム検索• groongaライブラリ(Ruby)

‒ 某番組情報サイトの検索‒ buzztter

商用・高負荷サイトでの導入実績あり

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

66

注意点• 64bit専用

‒ OSの仮想メモリ機構を最大限に利用• ファイルディスクリプタMAXあげる

‒ カラムごとに1ファイル‒ ネットワークサーバも兼用

• groongaストレージエンジンは、まだTritonnの域に達していない。

2010/12/29リリースで改善したいところ

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

67

まとめ (1)• groongaは、Sennaの特徴である「高速な更新」を真に実現するために書かれた全文検索エンジンである。

• groongaを、MySQLのストレージエンジンとして使うことができる。

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

まとめ (2)• ためしに使ってミルノデス• 開発者募集中!! バグ報告募集中!!• ブラジルでは検索エンジニアを大募集中です!!

68

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

69

Thank you!