私は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."
前もって感謝します。
このリクエストも機能しません:
それは、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;
firstname
とid
に複合主キーを作成したことに注意してください。これにより、データがfirstname
でパーティション化され(クエリを実行できるようになります)、データをid
でクラスター化します。デフォルトでは、データはid
によって昇順でクラスター化されます。この動作を変更するには、CLUSTERING ORDER
テーブル作成ステートメント:
WITH CLUSTERING ORDER BY (id DESC)
...そして、ORDER BY
句。
私は最近、クラスタリングの順序がCassandra( We Shall Have Order )でどのように機能するかについての記事を書きました。これはこれを説明し、いくつかの順序付け戦略もカバーしています。
Cassandraには1つの制約があります。where句で使用するフィールドはすべて、テーブルの主キーでなければなりません。または、そのフィールドにセカンダリインデックスが必要です。したがって、firstnameへのインデックスを作成する必要があります。その後、where条件でfirstnameを使用でき、期待どおりの結果が得られます。