2012-05-09 14 views
3

Iは、(例えば)「B」及び「C」2つ以上のcassandraスライスを効率的に交差させる方法は?

、私はタグ「A」タグ付きの記事を検索できるようにしたい this example

に示すような投稿とTaggedPostsカラムファミリを使用してい

問題は、私は完全にTaggedPostsをキーAで読み込んで、最初の10個の結果を例で示したように取り出すのではなく、キーBですべてのTaggedPostsと交差しています。これを行うためにあなたのアドバイスをするのはどうですか?

私はTaggedPostsに構造を変更することを考えていた:/交差するよりも、

get TaggedPosts where tag1=A and tag2=B and tag3=C; 

ではなく、それははるかに効果的であろうことを確認:と行のキーと

create colmun familty TaggedPosts with ... and column_metadata=[ 
    {column_name: tag1, ..., index_type: KEYS}, 
    {column_name: tag2, ..., index_type: KEYS}, 
    {column_name: tag3, ..., index_type: KEYS}, 

として投稿のIDを入れてくださいフィルタリングクライアント側

答えて

2

あなたのケースにとって理想的なスキーマは、その交差クエリを実行する頻度と、すばやく取得できる必要があるかどうかにかかっています任意のタグの任意の組み合わせ、またはNタグの任意のセットの結果、または特定の限られたタグでのみ行う必要があるかどうかを確認します。

私は疑うよう、あなたがタグの任意のセットに一致する記事を照会することができるようにしたい、場合は、この(cql3)のようなスキーマを持っているよりも、任意のより良い解決策は存在しないことがあります。

CREATE COLUMNFAMILY TaggedPosts (
    tag text, 
    post uuid, 
    blog_rowentries_rowkey text, 
    PRIMARY KEY (tag, post) 
) WITH COMPACT STORAGE; 

-- (note that this is the same actual data layout used in the "wtf is a supercolumn" article) 

そして、このような等「Aとポスト」、「Bとポスト」、のためのクエリ:

SELECT * FROM TaggedPosts WHERE tag = 'A' LIMIT 100; 
SELECT * FROM TaggedPosts WHERE tag = 'B' LIMIT 100; 
彼らは個別に照会している..so

、その後、あなたは結果をクライアント側をマージします。 100の限界はあなたのデータにとって理想的ではないかもしれません。理想的な値は、タグが重複する可能性があるかどうかによって決まります。すべての結果が得られることを保証するものではなく、単なるバッチサイズです。すべてのタグに一致する十分な記事が見つからない場合は、あなたが行うまでのUUID時間が最小のタグからより多くのバッチを検索します。

Solrインデックスの効率性とコーディングの面では、これはフルテキスト検索のようなものですが、Datastax EnterpriseまたはSolrを自分で統合するための何らかの方法です。 (免責事項:私はDatastaxのために働いています)

私がトピックに与えることができる最高のアドバイスは、スーパーカラムを使用しないことです。

+0

「Aとの投稿」のクエリでは、すべてのhttp://wiki.apache.org/cassandra/APIを取得する方法をThriftで見つけられませんでしたが、CQLで簡単に見えるので、あなたは本当に良いクライアントです。また、AとBのすべての記事を検索してから交差すると、数百万の投稿があればどうなりますか?最初の10個の交差を表示したいですか? –

+0

@ ca11111 ;うまくいけばそれはより多くを助ける。 –

+0

thx TP、あなたのアップデートをWTF-is-a-supercolumnのように更新しました。私は2列の列を作成しました。テキストのヘッダー(タイトル、作成者、日付、データID)はタグであり、data_idはテキスト列ファミリを指していますが、この無制限の100..200の制限でtag = aおよびtag = bをクエリする必要があります。おそらくそれを増やす必要があります私は10交差する場合は、美しさだろうか?カッサンドラは、SQLジョイントの並べ替えを行うことができる場合は、*タグからのタグを=またはタグ= b;)確かにソル、データストアコミュニティ(エンタープライズではない)、thx –

関連する問題