よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

[[MySQL(MyISAM) + Senna + Tritonn]]

楽天の森さんの話を聞いていて、Sennaがアツイとのことだったので早速調べてみた。
Senna全文検索エンジンで、DBMSスクリプト言語処理系等に組み込むことによって、その全文検索機能を強化することができる。
また、作成したインデックスに対して、インクリメンタルに文書の追加/変更/削除操作を加えることができ、一度作成したインデックスを作成し直す必要がない。

そしてなぜTritonnが必要かというと、

  • MySQLには日本語データに対する全文検索を行うための十分な機能が実装されていません。
  • MySQLでは全文検索を行うための実装面での十分な高速化が行われていません。

とのこと。
英語は単語間が半角スペース区切りであるため単語での検索が容易だが、日本語はそうではないため、Like演算子を用いて検索する必要がある。もしくは日本語も単語毎に半角スペースを挿入すればいいかもしれないが、それはビミョーだしね。
そしてLike演算子を用いるということはインデックスを利用した検索ができないため、必ずテーブルのフルスキャンが発生する。これだと性能的に問題あり。

2点目の高速化が不十分という点については、Sennaで『完全転置インデックス』という方式で実装することで対応しているらしい。

完全転置インデックスとは、インデックス内に各キーワードを含むレコードの識別子だけでなく、そのレコード内でのそのキーワードの出現位置についても記録する方式のインデックスです。

キーワードの出現位置を記録するため、転置インデックスと比較するとインデックスが保持する情報が増えてしまうため更新のオーバーヘッドも増加してしまうが、それに見合った高速化を実現できるみたい。

Torittonについてはacts_as_tritonnと呼ばれるRailsからTritonnを利用するプラグインもあるみたい。

残念なことにsennaについて調べていくと、MyISAMにしか対応(パッチをあてる部分がMyISAMの箇所)していないのがネック。理由はトランザクション部分の実装が難しいため。
今のところsennaのバージョン2で対応するというロードマップみたいだな。

senna参考資料