MySQL日本語全文検索エンジン

25
ニニニニニニニニニニニニニ ニニニニニニ ニニ ニ 1

description

ドワンゴ勉強会の生放送で使用した資料です。 MySQLと日本語全文検索エンジンについて導入部分。

Transcript of MySQL日本語全文検索エンジン

Page 1: MySQL日本語全文検索エンジン

ニコニコニュースと全文検索

研究開発本部星野 豊

1

Page 2: MySQL日本語全文検索エンジン

自己紹介• 2010 年 4 月 新卒入社

• 星野 豊 (id: con_mame)

• サーバ構築・運用

• ニコニコニュース・実況・ DVD ・ポイント担当

2

Page 3: MySQL日本語全文検索エンジン

今回のお話

MySQL を使って全文検索

        の全文検索

3

Page 4: MySQL日本語全文検索エンジン

MySQL で全文検索

4

Page 5: MySQL日本語全文検索エンジン

MySQL の全文検索SQL Parser

Storage Engine

Full Text Index

Full Text Parser

Storage Engine API

5

Page 6: MySQL日本語全文検索エンジン

全文検索 PluginSQL Parser

Storage Engine

Full Text Index

Full Text Parser

Storage Engine API

PatchStorage Engine(Plugin)

Full Text Parser (Plugin)

6

Page 7: MySQL日本語全文検索エンジン

パッチを当てる Plugin

Storage Engine API

MyISAM

 登録 /検索

結果

SQL Parser

patch

7

Page 8: MySQL日本語全文検索エンジン

Storage Engine を置き換える Plugin(1)

Storage Engine API

groonga Storage Engine

 登録 /検索

結果

SQL Parser

8

Page 9: MySQL日本語全文検索エンジン

Storage Engine を変える Plugin(2)

Storage Engine API

Sphinx Storage Engine

 検索

結果

SQL Parser

SQLを使って検索対象を登録出来ない

9

Page 10: MySQL日本語全文検索エンジン

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

Page 11: MySQL日本語全文検索エンジン

ニコニコニュースでは・・・

いっぱい種類があるけど・・・どれを使おうか??

11

Page 12: MySQL日本語全文検索エンジン

ニコニコニュースの検索要件

本文とタグで

検索出来ればいい

記事が公開されたらすぐ検索したい

検索結果が1秒以内にかえってきて欲しい

12

MySQLを使用したい

Page 13: MySQL日本語全文検索エンジン

要件で比較Senna sphinx groonga MySQL-ftppc

要件にあう検索

✓ △ ✓ ✓リアルタイムインデックス

✓ - ✓ ✓5.1対応 - ✓ ✓ ✓

13

Page 14: MySQL日本語全文検索エンジン

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

Page 15: MySQL日本語全文検索エンジン

ニコニコニュースでは・・・

MySQL-ftppc採用

15

Page 16: MySQL日本語全文検索エンジン

MySQL-ftppc とは全文検索パーサの詰合せ

16

space • 空白で分割する• タグ検索で使用している

bigram• 2 文字ずつ index を作成する• 検索漏れが少ない• 本文検索で使用している

mecab • 形態素解析を使用• 新しい単語に弱い

suffix • 接尾辞配列を使用• index 作成でクラッシュする問題がある

snowball • 英語に適したインデックス

Page 17: MySQL日本語全文検索エンジン

要件確認

本文とタグで

検索出来ればいい

記事が公開されたらすぐ検索したい

検索結果が1秒以内にかえってきて欲しい

17

リアルタイムインデックス

性能試験

簡単な検索

MySQLを使用したい

Page 18: MySQL日本語全文検索エンジン

まとめ• MySQL は Plugin として、用途に合わせて

全文検索 Plugin を選べる

• MySQL-ftppc は検索用途に合わせて Pluginを使い分ける

• 用途によって性能が異なる事があるので、事前の検証はしっかりやりましょう

18

Page 19: MySQL日本語全文検索エンジン

参考• http://sourceforge.net/apps/mediawiki/mysqlftppc/

index.php– ftppc 公式サイト

• http://www.slideshare.net/hiroaki.kawai/mysqlftppc– ftppc 紹介スライド

• http://mysqlftppc.svn.sourceforge.net/– ftppc ソース

19

Page 20: MySQL日本語全文検索エンジン

space Plugin

20

This is a pen

空白で分割

This is a pen

Page 21: MySQL日本語全文検索エンジン

bigram plugin

21

今日は晴れ

2 文字づつ分割

今日 日は は晴 晴れ

Page 22: MySQL日本語全文検索エンジン

mecab plugin

22

今日は晴れ

形態素で分割

今日 は 晴れ名詞 名詞助詞

Page 23: MySQL日本語全文検索エンジン

suffix plugin

23

abra

接尾辞で分割

a 4abra 1bra 2ra 3

Page 24: MySQL日本語全文検索エンジン

snow ball plugin

24

engineering/engineered

stemming 処理を行う

engineer

Page 25: MySQL日本語全文検索エンジン

MySQL-ftppc の設定共通

• normalization• unicode version

space

• Space drop long token

• space raw input

bigram

• なし

ページページ

㌻㍍メートル

メートル

文字を区別しないで検索出来るようにする

normalization

25