2013年8月31日土曜日

mroonga(groonga)+Mecabでtoo long sentence

php5.3 + mysql5.6 + mroongaで数万文字になるテキストにFullTextインデックスを貼って、phpからデータを流しているとMySQLがLost Connectionを吐きデータベースがクラッシュしたように停止することがあります。

mroongaのインデックスが壊れるのでテーブルの再作成が必要になるほどです。

いろいろ原因を考えてmax_allowed_packetを変えたり、timeoutを調整したりしましたが、実際の原因はMecabにありました。

私が作成していたテキストデータは改行コードをPHP上で"\n"としており、問題ないと思っていたのですが、どうもmroongaがMecabで形態素解析するときにそのまま\nという文字として読み込んでいるようでした。

Mecabは改行コードで文章の終わりを見ているようで、数十万文字の文章に改行コードが入っていないとなると文章長すぎ!処理しない!となるようです。

MySQL+mroongaでFullTextを扱わないデータなら\nで問題ないのですが、Mecabはうまく認識してくれないということでPHP_EOLを使用したところちゃんと改行と認識してくれました。

PHP_EOLは環境依存なので使っていなかったのですが、まぁmroongaインデックス用のfieldなのでよしとします。

ハマリにハマって4時間浪費。

0 件のコメント:

コメントを投稿