ミッションたぶんPossible

どこにでもいるシステムエンジニアのなんでもない日記です。たぶん。

Cassandraでスムーズな検索を実現するには?

 今Cassandraについて色々と調べています。今のところ情報収集ばっかりで実装まで行けてない為、いまいち手応えを感じられない日々ではありますが。今は主に以下の記事を参考にしています。まだ連載途中ですが、非常に分かり易いです。


Cassandraのはじめ方─手を動かしてNoSQLを体感しよう:連載|gihyo.jp … 技術評論社


 Apache CassandraBigtableなどに代表されるKVS*1のひとつで、Facebookのデータベースとして開発されたものがApacheに寄贈され、OSSとして世間に広まったものです。障害に強くスケーラビリティ(拡張性)に優れている反面、RDBと比べて検索が弱いのが難点。


 で、このCassandra、どうもインデックスを持たないのでkey以外は検索対象として使えないらしいんですね。とあるWeb記事で見かけたんですが、記事自体がどれだったか分かんなくなっちゃったし他にそれに関する情報が無いので、信憑性を問われるとちょっと困っちゃいますが・・・。Bigtableはデータ追加の都度インデックスを作ってくれるらしいので、もし真実であれば、この辺は同じKVSに分類されていても大きな違いと言えそうです。


 この問題点を解決する方法が無いかなぁ、と色々探していて見つけたのが以下の記事です。


Cassandraで登録しているカラムデータの検索方法(Cassandra:inverted indexの翻訳) - Symfoware


 要は自力でインデックスを作ってしまおう、という考え方ですね。インデックス用のテーブル(カラムファミリ)を作成し、本命にデータ追加したらこのインデックステーブルで、keyに値を、反対にvalueに登録したkeyを入れるという逆転したテーブルを作ると言うもの。なるほど、この方法ならなんとかvalueの中身も検索対象に出来ますね。ちょっとひと手間余計にかかりますが、パフォーマンスへの影響も最小限に抑えられそうです。



 もっと上手い方法がありましたら、本エントリのコメント欄か@までお知らせ頂けると大変助かります。

*1:Key Value Storeの略。厳密にはCassandraはKVSの概念からは外れるそうです。