3

この例に示すように、Posts および TaggedPosts 列ファミリーを使用しています

タグ「A」、「B」、「C」でタグ付けされた投稿を検索できるようにしたいと思います(例)

問題は、例に示すように最初の 10 個の結果を取得するだけでなく、キー A で TaggedPosts を完全に読み取る必要があることです。次に、キー B ですべての TaggedPosts と交差して、1 つを見逃さないようにする必要があります。

それは非常に非効率的です。これを行うためのアドバイスは何ですか?

私は TaggedPosts 構造を変更することを考えていました: そして Posts id を Rows キーとして置き、

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},

そして、やります:

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

ただし、クライアント側で交差/フィルタリングするよりもはるかに効果的かどうかはわかりません

4

1 に答える 1

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;

..したがって、それらは個別にクエリされ、結果をクライアント側でマージします。100 という制限は、データにとって理想的ではない場合があります。理想的な値は、タグが重複する可能性によって異なります。必要なすべての結果が得られることを保証するものではありません。明らかに、これは単なるバッチ サイズです。すべてのタグに一致する十分な数の投稿が見つからない場合は、一致するまで、uuid 時間が最も短いタグからさらにバッチをクエリします。

これは全文検索のような問題であるため、Solr インデックスを使用した効率性とコーディングの容易さの点で、これよりもはるかに優れている可能性がありますが、Datastax Enterprise またはその他の方法が必要になります。 Solrを自分で統合します。(免責事項: 私は Datastax で働いています。)

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

于 2012-05-09T18:31:52.943 に答える