隔週連載groonga

第6回 [実録] MySQL向け全文検索エンジン「Tritonn」から「mroonga」への移行ガイド(1)

この記事を読むのに必要な時間:およそ 6 分

初めまして,吉田健太郎と申します。目黒にある株式会社リブセンスで,Web系インフラの研究開発エンジニアをしております。

MySQLで完結する日本語対応の全文検索プロダクトである「Tritonn(MySQL 5.0+Senna)」が広まり始めたのは2008年頃でした。そして時は過ぎること約5年。データやトランザクション数の増加などに伴い,レガシーを捨てMySQL 5.5や5.6への移行を検討したい。しかしSolrへ乗り換えるほどでもなく,引き続きシンプルにSQLを用いた,リレーショナルな日本語対応の全文検索機能を使いたい。私のほかにも,そういった構想をお持ちの方はいるかと思います。

そこで,groongaのMySQLバインディング版である「mroonga」の出番です。MySQL 5.6とmroongaを組み合わせることで,この構想を実現できます。

1ヶ月間の検証期間で見つかった総計16にも及ぶ機能追加や不具合改善を,開発者の皆様と共に乗り越えたことで,mroongaの安定性がとても向上しました。さらに2013年5月のリリースで待望のWプラグマにも対応し,システム移行の条件がすべて整いました。

数回に渡り,私が体験したTritonnからmroongaへのシステム移行プロジェクトをお届けします。

Tritonnが実現できたことと,残された課題

MySQLが標準で備える全文検索機能は簡素なもので,単語をスペースなどで区切るという欧米圏の分かち書きに基づいたトークナイザを前提とした設計です。そのため,日本語文での使用には難がありました。

Tritonnは,日本語全文検索機能の追加と検索の高速化を実現すべく,ビルトインのFULLTEXT検索をSennaに置き換えたプロダクトです。これにより,MyISAMのビルトインFULLTEXTでは使えなかった,MeCabやN-gramでのトークナイザと高速な検索機能を実現しました。しかしながら,Tritonnは次の点で優れた成果を納めたものの,いくつかの課題が残りました。

実現できたこと
  • MeCabやN-gramでのトークナイズに対応
  • 完全転置インデックスを用いた高速な検索を実現
  • 転置インデックスの一部をmmapすることで,データ更新速度の大幅改善を実現
  • MeCabを用いてトークナイズした形態素を単語として転置インデックスとすることで,高精度を実現
  • SQLならではの複雑な問い合わせにも対応できる柔軟性を維持
残された課題
  • パフォーマンス問題
    • LIMIT句, COUNT(*), OR条件追加時の検索が遅い
    • MySQLが持つ1テーブル1インデックスという制約を受け,全文検索以外の条件を加えて絞り込むと遅い
    • MyISAMを利用しているため,更新中はテーブルロックとなり参照クエリを発行できない
  • 信頼性の問題
    • ストレージエンジンがMyISAMのため,トランザクションに対応していない

これらの課題を解決すべく,2009年よりSennaの後継プロジェクトとしてgroongaが動きだし,翌2010年にはgroongaのMySQLバインディング版の開発も始まりました。それがmroongaです。

次の記事も参照ください。

Tritonn, mroonga以外のMySQLで完結する全文検索プロダクト

mroonga移行を検討している際に見つけた,InnoDB単体での全文検索機能と,PARSERプラグインであるMySQL-ftppcという2つの製品を紹介します。

InnoDB fulltext search (InnoDB FTS)

MySQL 5.6.4からは,InnoDB単体でFULLTEXT検索が可能となりました。機能としてはMyISAMが備えていたものと同程度ですが,裏側がInnoDBであるため,参照・更新速度が格段に向上しています。しかしMySQL 5.6.12時点では,CJK(Chinese-Japanese-Korean)非対応なだけでなく,Full-Text Parser Pluginによる拡張に対応していません。

そのため,MySQL-ftppcのようなMeCabやN-gramを用いた日本語検索対応を実現するプラグインの利用が手軽にできないことが惜しいポイントです。

より詳細な情報は次の記事を参照ください。

MySQL-ftppc

MySQL-ftppcとは,MySQL Full Text Parser Plugin Collectionの略で,MyISAMのFULLTEXTインデックスのトークナイザ機能を追加するPARSERプラグインです。

これは5つのトークナイザに対応しており,bigram, mecab, snowball, space, suffixをインデックス毎に使い分けることができます。

パフォーマンスとしてはXeon L5520のマシンで400万行,インデックスファイル(.MYI)のサイズが2GBを対象とした単純な全文検索で1クエリ0.8秒程度の結果でした。Tritonn/mroongaでは0.2秒程度のため,実用性から考えると,数十万件規模のレコードまでをAND検索するシンプルな利用方法に限定されます。

より詳細な情報は次の記事を参照ください。

機能比較

これまでに取り上げた4つのプロダクト,Tritonn,mroonga,MySQL-ftppc,InnoDB FTSの対応機能比較を次の表にまとめました。

Tritonn mroonga MySQL-ftppc InnoDB FTS
InnoDB × ×
MyISAM ×
MeCab ×
N-gram ×
Dプラグマ × ×
Eプラグマ × × ×
Wプラグマ × ×
MySQL 5.0 × × ×
MySQL 5.1 × ×
MySQL 5.5 × ×
MySQL 5.6 ×

mroongaのN-gramについては,bigramだけでなく,uni-gramやtri-gramの他,多数の派生N-gramでのトークナイザに対応しています。さらに2013年5月末リリースのmysql-mroonga-3.04にて,待望のWプラグマに対応しました。これにより,Tritonnからmroongaへ移行する際の障壁はEプラグマのみになったと言えます。

Tritonnから乗り換えるならば,mroongaの1択ですね。

著者プロフィール

吉田健太郎(Kentaro Yoshida)

株式会社リブセンス,Web系インフラの研究開発エンジニア。

ITベンチャー立ち上げに参画し,幅広い領域での経験を積むこと8年目。フルスタックエンジニアを目指して,湧き出るアイディアを形にする日々を過ごしている。

GitHub:https://github.com/y-ken/
ブログ:http://y-ken.hatenablog.com/

コメント

コメントの記入