2012-04-06 27 views
4

Cassandraの列ファミリを使って、次のようなSQLクエリと同様の部分検索を実行しようとしています。SELECT * FROM columnfamily WHERE col = 'val *' val *少なくとも最初の3文字 'val'に一致する値。Cassandra(Pycassa/CQL)返信部分一致

私はSELECT機能でdatastax's documentationを読んだことがありますが、WHERE条件の一部をサポートしていないようです。何か案は?

答えて

9

Cassandraではこのようなワイルドカードはサポートされていませんが、同じ最終結果を得ることができるようにデータをモデル化できます。

このクエリを実行したい列を取得し、それを第2の列ファミリに非正規化します。このCFにはワイルドカードクエリを実行するcolの値としてカラム名を含む1つのワイド行があります。このCFの列の値は、元のCFの行キーまたは元の行の他の表示のいずれかになります。

次に、スライシングを使用して気になる値を取得します。これは上でスライスする広い行だった場合たとえば:

CQLを使用して
+---------+----------+--------+----------+---------+--------+----------+ 
| RowKey | aardvark | abacus | abacuses | abandon | accent | accident | 
|   +----------+--------+----------+---------+--------+----------+ 
|   |   |  |   |   |  |   | 
|   |   |  |   |   |  |   | 
+---------+----------+-----------------------------+--------+----------+ 

あなたは、このクエリを使用した「ABA *」で始まるすべてを選択することができます*:

SELECT 'aba'..'abb' from some_cf where RowKey = some_row_key; 

これは、あなたの列を与えるだろう'abacus'、 'abacuses'、 'abandon'のためのものです。

この戦略に注意すべきいくつかのものがあります。

  • 上記の例では、あなたがそれら(区別するためにいくつかの方法を持っている必要があり、同じcolumn_nameには、そうでない場合に挿入して物事を持っている場合ワイド列ファミリは他の有効な値を破棄します)。あなたがこれを行うことができる1つの方法は、wordの複合列を使用することです:some_unique_value
  • 上記のモデルでは、文字列の最後にワイルドカードしか使用できません。文字列の先頭にあるワイルドカードは、いくつかの変更を加えるだけで簡単に処理できます。文字列の途中にあるワイルドカードははるかに難しいでしょう。

Cassandraでは、アドホックなクエリを簡単に実行することはできません。代わりに、データをどのように使用するかを把握し、それに応じてCFをモデル化する必要があります。このようなモデリングデータの詳細については、indexing data in CassandraのEd Anuffのこのブログ記事をご覧ください。

*今後のリリースのCassandraでは、列をスライスするためのCQL構文が変更されています。

+0

ありがとうございました!これはまさに私が必要としていたものです。 –

+0

どうやってそれを第2の列ファミリに非正規化しますか? ?もし私がaardvark.abacus.abacusesのようなキーを持っていれば、* .abacusesで終わるもの – user1387717