Je suis nouveau avec cassandra et j'ai rencontré un problème. J'ai créé un demodb d'espace de clés et une table utilisateurs. Cette table a 3 colonnes: id (int et clé primaire), prénom (varchar), nom (varchar). cette demande m'envoie le bon résultat:
SELECT * FROM demodb.users WHERE id = 3;
mais celui-ci:
SELECT * FROM demodb.users WHERE firstname = 'francois';
ne fonctionne pas et j'obtiens le message d'erreur suivant:
InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on the restricted columns support the provided operators: "
Cette demande ne fonctionne pas non plus:
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."
Merci d'avance.
Cette demande ne fonctionne pas non plus:
C'est parce que vous comprenez mal comment fonctionne l'ordre de tri dans Cassandra. Au lieu d'utiliser un index secondaire sur firstname
, créez une table spécifiquement pour cette requête, comme ceci:
CREATE TABLE usersByFirstName (
id int,
firstname text,
lastname text,
PRIMARY KEY (firstname,id));
Cette requête devrait maintenant fonctionner:
SELECT * FROM usersByFirstName WHERE firstname='francois'
ORDER BY id DESC LIMIT 5;
Notez que j'ai créé une clé primaire composée sur firstname
et id
. Cela partitionnera vos données sur firstname
(vous permettant d'interroger par lui), tout en regroupant vos données par id
. Par défaut, vos données seront regroupées par id
dans l'ordre croissant. Pour modifier ce comportement, vous pouvez spécifier un CLUSTERING ORDER
dans votre instruction de création de table:
WITH CLUSTERING ORDER BY (id DESC)
... et vous n'aurez même plus besoin d'un ORDER BY
clause.
J'ai récemment écrit un article sur le fonctionnement de l'ordre de clustering dans Cassandra ( We Shall Have Order ). Il explique cela et couvre également certaines stratégies de commande.
Il y a une contrainte dans cassandra: tout champ que vous souhaitez utiliser dans la clause where doit être la clé primaire de la table ou il doit y avoir un index secondaire. Vous devez donc créer un index pour le prénom et seulement après cela, vous pouvez utiliser le prénom dans la condition where et vous obtiendrez le résultat que vous attendiez.