ニコニコニュースと全文検索
研究開発本部星野 豊
1
自己紹介• 2010 年 4 月 新卒入社
• 星野 豊 (id: con_mame)
• サーバ構築・運用
• ニコニコニュース・実況・ DVD ・ポイント担当
2
今回のお話
MySQL を使って全文検索
の全文検索
3
MySQL で全文検索
4
MySQL の全文検索SQL Parser
Storage Engine
Full Text Index
Full Text Parser
Storage Engine API
5
全文検索 PluginSQL Parser
Storage Engine
Full Text Index
Full Text Parser
Storage Engine API
PatchStorage Engine(Plugin)
Full Text Parser (Plugin)
6
パッチを当てる Plugin
Storage Engine API
MyISAM
登録 /検索
結果
SQL Parser
patch
7
Storage Engine を置き換える Plugin(1)
Storage Engine API
groonga Storage Engine
登録 /検索
結果
SQL Parser
8
Storage Engine を変える Plugin(2)
Storage Engine API
Sphinx Storage Engine
検索
結果
SQL Parser
SQLを使って検索対象を登録出来ない
9
Full Text Parser を置換える Plugin
SQL Parser
MyISAM
space mecab bigram Suffix snowball
Full Text Parser
Storage Engine API
Full Text Index
MySQL 標準の Full
Text Parser
MySQL-ftppc
10
ニコニコニュースでは・・・
いっぱい種類があるけど・・・どれを使おうか??
11
ニコニコニュースの検索要件
本文とタグで
検索出来ればいい
記事が公開されたらすぐ検索したい
検索結果が1秒以内にかえってきて欲しい
12
MySQLを使用したい
要件で比較Senna sphinx groonga MySQL-ftppc
要件にあう検索
✓ △ ✓ ✓リアルタイムインデックス
✓ - ✓ ✓5.1対応 - ✓ ✓ ✓
13
groonga と MySQL-ftppc
14
• groonga storage engine は Ver. 0.1 が出たばかり
• groonga を使用するためにコードを書き換えないといけない
• 最新版でも ICU ライブラリを使用するとクラッシュ• メモリ周りの処理で MySQL ごと落ちる
• branch の ftnorm.c/ftnorm.h で置き換えて解決!• mecab plugin r126• bigram plugin r125
groonga 作者
MySQL-ftppc
ニコニコニュースでは・・・
MySQL-ftppc採用
15
MySQL-ftppc とは全文検索パーサの詰合せ
16
space • 空白で分割する• タグ検索で使用している
bigram• 2 文字ずつ index を作成する• 検索漏れが少ない• 本文検索で使用している
mecab • 形態素解析を使用• 新しい単語に弱い
suffix • 接尾辞配列を使用• index 作成でクラッシュする問題がある
snowball • 英語に適したインデックス
要件確認
本文とタグで
検索出来ればいい
記事が公開されたらすぐ検索したい
検索結果が1秒以内にかえってきて欲しい
17
リアルタイムインデックス
性能試験
簡単な検索
MySQLを使用したい
まとめ• MySQL は Plugin として、用途に合わせて
全文検索 Plugin を選べる
• MySQL-ftppc は検索用途に合わせて Pluginを使い分ける
• 用途によって性能が異なる事があるので、事前の検証はしっかりやりましょう
18
参考• http://sourceforge.net/apps/mediawiki/mysqlftppc/
index.php– ftppc 公式サイト
• http://www.slideshare.net/hiroaki.kawai/mysqlftppc– ftppc 紹介スライド
• http://mysqlftppc.svn.sourceforge.net/– ftppc ソース
19
space Plugin
20
This is a pen
空白で分割
This is a pen
bigram plugin
21
今日は晴れ
2 文字づつ分割
今日 日は は晴 晴れ
mecab plugin
22
今日は晴れ
形態素で分割
今日 は 晴れ名詞 名詞助詞
suffix plugin
23
abra
接尾辞で分割
a 4abra 1bra 2ra 3
snow ball plugin
24
engineering/engineered
stemming 処理を行う
engineer
MySQL-ftppc の設定共通
• normalization• unicode version
space
• Space drop long token
• space raw input
bigram
• なし
ページページ
㌻㍍メートル
メートル
文字を区別しないで検索出来るようにする
normalization
25
Top Related