Lucandra記事を訳してみる

Lucandra: Cassndra ベースの Lucene バックエンド

今回のゲスト投稿では、 Jake Luciani (@tjake) が Cassandra ベースの Lucene バックエンドである Lucandra を紹介してくれます。

  • 更新: Jake は、 2010年4月に NY Search & Discovery Meetupで Lucandra について話をしてくれるようです。今すぐ登録を!
  • 更新2: Lucandra meetup トークでのスライドは、 http://www.jroller.com/otis/entry/lucandra_presentation にあります。多くのユーザにとって、 Lucene ベースのソリューションを展開するもっともトリッキーなパートが、ストレージ、読み書き、インデックス最適化をどのように管理し、スケールさせるかだと思います。Solr や Katta (その他を含む) がこれらに取り組んできましたが、未だに、多くの管理やメンテナンスを必要としている。この問題は、 Lucene に特定される問題ではありません。実際に多くのデータ管理アプリケーションでは、非常に多くの管理を必要としています。大規模データの管理とスケールの問題に対して、 "nosql" ムーブメントは、より一般的になり始めています。多くのポピュラーで広まって使われだしている "nosql" システムのひとつに、 Apache Software Foundation プロジェクト、元々は Facebook で開発され Cassandra と呼ばれていたものがあります。

Cassandraとは?

Cassandra は、スケールと管理が容易な行指向データストアで、GoogleBigTable をモデルとしながら、 Amazon の S3によってビルトされています。 Cassandra の最も大きな違いのひとつに、 HBase や BigTable のようなグローバルなファイルシステムに依存しない点があります。 Cassandra は、分散 peer to peer の "Gossip" を利用しています。この "Gossip" は2つの意味を持ちます。

  1. 単一障害点をもたず
  2. クラスタへのノード追加が、ひとつの生存ノードに追加するのと同じくらい容易である

Cassandra はまた、 multi-master 書き込み、ラック認識を組み込みでもち、 gracefully にダウンしたノードを扱うことができます。 Cassandra は、活発なコミュニティをもち、現在、例を上げるならば FaceBookDiggTwitter などの企業に利用されています。

Lucandra に入りましょう

Lucandra は Lucene の Cassandra バックエンドです。 FaceBook における Cassandra のもともとの使われ方は検索ですので、 Cassandra と Lucene を合わせることは当然のことだと思います。 Lucene のコアデザインは、非常にシンプルで、 custom Analyzer 、 Write 、 Reader などの実装を取り外しすることを実現しています。例えば、 DbDirectory がやっているようにバックエンドとして、 Lucene のトップの Lucene Directory インタフェイスをビルドしようとするのではなく、私たちのアプローチは、直接 Cassandra トップへと向かう IndexReader 、 IndexWrite の実装でした。ここでは、どのようにして、単語とドキュメントが Cassandra に保持されているかを示します。
単語は、インデックス、フィールド、単語からなる複合キーとなっており、カラム名としてドキュメントIDを、カラム値として位置ベクトルを持ちます。

Term Key ColumnName Value
"indexName/field/term" { documentId , positionVector }
Document Key
"indexName/documentId" { fieldName , value }

Cassandra は、キーの範囲および行のグループを抽出することが可能で、それゆえ、各クエリに対するネットワークIOを最小化する読み込みパフォーマンスまで実際にチューニングすることが出来ます。また、書き込みは Cassandra によって、私たちがインデックスの最適化や新規書き込みにおけるインデックスのリオープンについて悩むことはなく、インデックス化、複製されます。これは、私たちが、 soft real-time 分散検索エンジンを獲得したことを意味します。
Lucandra 検索におけるインパクトは、元々の Lucene 検索との比較にあります。私たちのテストでは、 Lucandra IndexReader は デフォルトの IndexReader より ~10% 遅くなっていました。しかしながら、これは、得たものと比べると全然受け入れられるものではないでしょうか。
単語キーで下に、すべての単語が効率的に書き込まれるため、書き込みに対して、 Lucandra は、通常の Lucene に対して遅くなります。しかし、幸運なことに、キー群に対するバッチ書き込みが可能になるため、次のバージョンの Cassandra で解決されます。
もうひとつの主な問題は、現在のコードにおいて単語採点が無いことです。これは単純にまだ要求されていないためです。追加はその他のカラムを用いれば比較的簡単です。
Lucandra を用いた Twitter 検索アプリ (http://sparse.ly) を試すして Lucandra の動作を見てください。
このサービスでは、 Lucandra は独占的にかつ他のリレーショナルまたはその他のデータベースを利用しています。

Lucandra in Action

Lucandra の仕様は非常に簡単で、通常の Lucene 検索アプリケーションから Lucandra へのスイッチはコードを数行書き直すだけです。見てみましょう。

  1. 最初に、 Cassandra へのコネクションを生成する必要があります。

import lucandra.CassandraUtils;
import lucandra.IndexReader;
import lucandra.IndexWriter;
...
Cassandra.Client client = CassandraUtils.createConnection();

  1. 次に、 Lucandra の IndexWriter および IndexReader 、Lucene 自身の IndexSearcher を作ります。

IndexWriter indexWriter = new IndexWriter("bookmarks", client);
IndexReader indexReader = new IndexReader("bookmarks", client);
IndexSearcher indexSearcher = new IndexSearcher(indexReader);

ここから、普通の Lucene のように、 IndexWriter と IndexSearcher を使うことができます。具体的なクラスとして BookmarksDemo を見てみましょう。

次は? Solandra!

Lucene で構築するものとして Lucandra だと見てきました。例えば、 Lucandra と Solr や単純な Solr 管理を統合するつもりです。もし、すでに試みられているのであれば、これについては私たちのコードでもすぐにサポートするつもりです。