web-dev-qa-db-ja.com

cassandra、非主キーを介して選択

私はcassandraで新しく、問題に遭遇しました。キースペースdemodbとテーブルusersを作成しました。このテーブルには、id(intおよび主キー)、firstname(varchar)、名前(varchar)。このリクエストは私に良い結果を送ります:

SELECT * FROM demodb.users WHERE id = 3;

しかしこれは:

SELECT * FROM demodb.users WHERE firstname = 'francois';

が機能せず、次のエラーメッセージが表示されます。

InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on the restricted columns support the provided operators: "

このリクエストも機能しません:

SELECT * FROM users WHERE firstname  = 'francois'  ORDER BY id DESC LIMIT 5;
InvalidRequest: code=2200 [Invalid query] message="ORDER BY with 2ndary indexes is not supported."

前もって感謝します。

15
mel

このリクエストも機能しません:

それは、Cassandraでのソート順の仕組みを誤解しているためです。 firstnameでセカンダリインデックスを使用する代わりに、次のように、このクエリ専用のテーブルを作成します。

CREATE TABLE usersByFirstName (
  id int,
  firstname text,
  lastname text,
  PRIMARY KEY (firstname,id));

このクエリは機能するはずです。

SELECT * FROM usersByFirstName WHERE firstname='francois'
ORDER BY id DESC LIMIT 5;

firstnameidに複合主キーを作成したことに注意してください。これにより、データがfirstnameでパーティション化され(クエリを実行できるようになります)、データをidでクラスター化します。デフォルトでは、データはidによって昇順でクラスター化されます。この動作を変更するには、CLUSTERING ORDERテーブル作成ステートメント:

WITH CLUSTERING ORDER BY (id DESC)

...そして、ORDER BY句。

私は最近、クラスタリングの順序がCassandra( We Shall Have Order )でどのように機能するかについての記事を書きました。これはこれを説明し、いくつかの順序付け戦略もカバーしています。

15
Aaron

Cassandraには1つの制約があります。where句で使用するフィールドはすべて、テーブルの主キーでなければなりません。または、そのフィールドにセカンダリインデックスが必要です。したがって、firstnameへのインデックスを作成する必要があります。その後、where条件でfirstnameを使用でき、期待どおりの結果が得られます。

7
Helping Hand..