ichii mysql-osc2011tokyofall

26
MySQL 全文検索とか 2011/11/20 (sun) at OSC2011 Tokyo/Fall いちい たかし / @ichii386 Sunday, November 20, 11

Upload: takashi-ichii

Post on 07-Jul-2015

1.446 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Ichii mysql-osc2011tokyofall

MySQL で全文検索とか

2011/11/20 (sun) at OSC2011 Tokyo/Fallいちい たかし / @ichii386

Sunday, November 20, 11

Page 2: Ichii mysql-osc2011tokyofall

自己紹介• いちい たかし / @ichii386

• 興味があるもの• MySQL, Solaris, ZFS, Debian, php, awk, rsync, InfiniBand, etc.

• ニガテなもの• perl, 魚介類

• グリー株式会社で働いてます• ふだんはログ屋さん

Sunday, November 20, 11

Page 3: Ichii mysql-osc2011tokyofall

はじめに

• MySQL つかっていますか?

• 全文検索つかっていますか?

Sunday, November 20, 11

Page 4: Ichii mysql-osc2011tokyofall

MySQL について• オープンソースの RDBMS

• 最近は公式にも ‘‘NoSQL に対応します’’

• 汎用的な「データを保存する場所」

• 膨大な運用ノウハウの蓄積

• replication, backup, etc.

Sunday, November 20, 11

Page 5: Ichii mysql-osc2011tokyofall

余談: RDBMS vs NoSQL• そんな戦いはほんとうに存在するの?

• どちらもデータを保存する場所

• RDBMS

• JOIN できる

• (比較すると) 遅い

• NoSQL

• Primary Key もしくは Hash くらいしかインデックスがない

• チョー速い

Sunday, November 20, 11

Page 6: Ichii mysql-osc2011tokyofall

データベースのおしごと

• データを保存します

• インデックスを作ります

• 条件に応じて必要なデータを探してきます

Sunday, November 20, 11

Page 7: Ichii mysql-osc2011tokyofall

インデックスとは

• 検索を速くするためのもの

• B-tree とか hash とか suffix array とか

• 見出し。索引。

• 本の最後についてるやつですね

Sunday, November 20, 11

Page 8: Ichii mysql-osc2011tokyofall

検索とは• 「情報検索」

• ユーザの情報要求を満たすためのなんたらかんたら

• 図書館の時代から長い歴史がある

• MySQL みたいなデータベースが対象とする検索

• 必要なデータがあることがわかっていて、それを探してくる

• SELECT blog_text FROM blog_data WHERE blog_ id = 1

• もしかしたら無いかもしれないけど、「あるとすればこうだろ」という条件を渡す

• SELECT blog_text FROM blog_data WHERE user_id = 1

Sunday, November 20, 11

Page 9: Ichii mysql-osc2011tokyofall

データがあるに決まっている検索

• アプリケーションの設計がバグってなければ、あるはず。

• Primary Key による検索や NoSQL 的な使い方にむいてる

Sunday, November 20, 11

Page 10: Ichii mysql-osc2011tokyofall

データがあるかわからない検索

• ユーザが自由に入力するような場合

• たとえば、全文検索

Sunday, November 20, 11

Page 11: Ichii mysql-osc2011tokyofall

何を探したいのかよくわかってない検索

• いちばん大変。

• 「もしかして」

• 関連検索

• あまり MySQL とかのレイヤが目指すところではない

Sunday, November 20, 11

Page 12: Ichii mysql-osc2011tokyofall

ちかくのスタバどこ?

Sunday, November 20, 11

Page 13: Ichii mysql-osc2011tokyofall

さまざまなやりかた• ‘‘ナイーブ’’ な方針

• 見つかるまで歩き続ける

• 前計算機世代

• そのへんの人に聞く

• 前 Web 世代

• 電話帳を探す

• 最近の若者

• ググるでしょJK

当たり外れが多い司書の時代

永遠に時間をかければ「絶対に見つかる」

閉店してたらどうする?

ディレクトリ型

GOOD!

Sunday, November 20, 11

Page 14: Ichii mysql-osc2011tokyofall

「検索が速い」は本質的に重要

• いや、だって、遅くていいなら、毎回

grep すりゃいいじゃん!

• LIKE ‘%hoge%’ でよくね?

Sunday, November 20, 11

Page 15: Ichii mysql-osc2011tokyofall

全文検索とは• full-text search

• すべての文から検索すること

• 一般には

• ある文の集合から、検索語を部分文字列として含む文の部分集合を求める

Sunday, November 20, 11

Page 16: Ichii mysql-osc2011tokyofall

全文じゃない検索とは• 例えば、本の索引• えらい編集者さんがうまいこと作ってくれる

• ブログ

• 著者や読者が決めたタグで検索できる

• えらい人が考えた語句に一致しないと探せない• 表記ゆれ: 仮名/漢字、活用

• 本文に書いてあるとは限らない場合: 「これはひどい」

Sunday, November 20, 11

Page 17: Ichii mysql-osc2011tokyofall

高速に、全文から、好きな語句で検索するために

• 文を検索語句に分割する• n-gram, 形態素解析 (mecab)

• 分割した語句を文書IDと位置情報とセットで保存

• 転置インデックス (inverted index), suffix array

• 検索するとき• 検索語を必要に応じて分割し、インデックスから一致するところを探す

Sunday, November 20, 11

Page 18: Ichii mysql-osc2011tokyofall

インデックスが持つ情報• じつは、元の文章を復元できるくらいの情報を持っています

• 元の文章の全ての部分文字列を含む• スニペットが表示できる

• インデックス自体がデータ保存領域になっている• データベースの容量も削減できる• 一見よさそうに思えるんだけど...

Sunday, November 20, 11

Page 19: Ichii mysql-osc2011tokyofall

RDBMSと全文検索の関係• 「検索したい!」という意図では似ている• 同じように SQL 使いたいし、JOIN もしたい

• しかし、実際はかなり仕組みが違っている

• いわゆる「データベース製品」と「全文検索ソリューション」が別ラインになりがちな理由のひとつ。

• データの2重化、整合性の問題

• 運用ノウハウの分散、コスト

Sunday, November 20, 11

Page 20: Ichii mysql-osc2011tokyofall

MySQL での全文検索• MyISAM ストレージエンジン (昔から)

• 日本語非対応

• Tritonn (MySQL-5.0)

• 全文検索エンジン Senna による MyISAM の拡張

• MySQL-5.0 しばり, まだ使っている人多そう

• mroonga (MySQL-5.1 以降, MariaDB)

• 全文検索対応の groonga をつかった MySQL のストレージエンジン

• Tritonn の後継として開発されている

• InnoDB FTS (MySQL-5.6)

• MySQL Labs で公開中

Sunday, November 20, 11

Page 21: Ichii mysql-osc2011tokyofall

MySQL のストレージエンジン

• (RDBMS としての) MySQL の特徴のひとつ。

• テーブルごとに、プラグインでデータ保存領域の実装を変えられる

• MyISAM, InnoDB, Memory, Blackhole など

• MySQL デーモンは SQL を理解してストレージエンジンに処理を橋渡し

• ストレージエンジンがどうやってデータを保存するか、どういうインデックスを内部で持つかは自由

• テーブル間の JOIN もストレージエンジンによらず可能

• ...のは理想だけど、実用的に動かすのはけっこう大変

Sunday, November 20, 11

Page 22: Ichii mysql-osc2011tokyofall

けっきょく、MySQL なら• ストレージエンジンが自由に選べる (作れる)

• なので、仕組みがちょっと複雑な全文検索だって、作ればふつうに使える

• 使い方は今までの MySQL と同じで楽ちん

• Replication だっておなじ

Sunday, November 20, 11

Page 23: Ichii mysql-osc2011tokyofall

今後の展望• 10月にいろいろイベント行って来ました

• Oracle Open World 2011 @SF

• MySQL 自体の発展のいきおい

• Percona Live 2011 @London

• Oracle をやめてしまった元 MySQL の開発者たち

• ストレージエンジンビジネスが盛り上がるかも?

• Hadoop とか MongoDB とか「データを置く場所」はいろいろありますが、 MySQL はあいかわらずがんばっています

Sunday, November 20, 11

Page 24: Ichii mysql-osc2011tokyofall

今後の展望 (2)• 全文検索じたいの必要性はそう変わらないでしょう• MySQL の仕組みとして全文検索も対応しやすい

• 海外でどんなに盛り上がっても、日本語対応は日本発のほうが強いです

• とくに形態素解析など、日本語固有の問題に関連しがち

• なので、日本が頑張れる分野だと思います

Sunday, November 20, 11

Page 25: Ichii mysql-osc2011tokyofall

個人な本命• じつのところ、まだ Tritonn から脱出できていません

• 某G社の一部システムでの話

• mroonga がんばってください

• 現状では、まだある程度の量のデータを入れるには、運用に特殊能力が必要です

• OSC.DB でも発表があったそうです

Sunday, November 20, 11

Page 26: Ichii mysql-osc2011tokyofall

• ありがとうございました

• 謝辞

• 本発表は groonga の開発者でもある森大二郎氏の『検索エンジンはなぜ見つけるのか』(日経BP社)にインスパイアされました。

Sunday, November 20, 11