web-dev-qa-db-fra.com

Existe-t-il une requête pour Cassandra identique à la condition SQL: LIKE?

La condition LIKE nous permet d'utiliser des caractères génériques dans la clause where d'une instruction SQL. Cela nous permet d'effectuer une correspondance de modèle. La condition LIKE peut être utilisée dans n'importe quelle instruction SQL valide - sélectionnez, insérez, mettez à jour ou supprimez. Comme ça

SELECT * FROM users
WHERE user_name like 'babu%';

comme la même opération ci-dessus, toute requête est disponible pour Cassandra en CLI.

24
BobDroid

Réponse simple: il n'y a pas d'équivalent de [~ # ~] comme [~ # ~]

https://docs.datastax.com/en/cql/3.3/cql/cql_reference/cqlSelect.html

Voici la référence de commande pour v0.8:

http://www.datastax.com/docs/0.8/references/cql#cql-reference

Si vous conservez un autre ensemble de lignes contenant des références à un nom d'utilisateur:

ligne: nom d'utilisateur: bab -> col: babu1, col: babar ligne: nom d'utilisateur: babu -> col: babur

En fait, vous trichez en préremplissant tous les résultats que vous recherchez normalement dans le monde du SGBDR. Le stockage est bon marché par rapport à ce qu'il était il y a des années ... c'est pourquoi c'est maintenant une approche acceptée. Il est moins intensif sur le CPU et la mémoire de récupérer une liste d'informations préremplie.

13
sdolgy

Depuis Cassandra 3.4 (3.5 recommandé), les requêtes LIKE peuvent être réalisées en utilisant un index secondaire attaché SSTable (SASI).

Par exemple:

CREATE TABLE cycling.cyclist_name ( 
  id UUID PRIMARY KEY, 
  lastname text, 
  firstname text
);

Création de la SASI comme suit:

CREATE CUSTOM INDEX  fn_prefix ON cyclist_name (firstname)
USING 'org.Apache.cassandra.index.sasi.SASIIndex';

Ensuite, une requête LIKE préfixe fonctionne:

SELECT * FROM cyclist_name WHERE firstname LIKE 'M%';
SELECT * FROM cyclist_name WHERE firstname LIKE 'Mic%';

Ces exemples et d'autres options de configuration, comme les requêtes de suffixe, peuvent être trouvés dans la documentation

Une explication plus approfondie sur le fonctionnement de SASI peut être trouvée ici .

26
nstrelow

Je sais: c'est une vieille question mais il y a une solution pour ce sujet:

Vous ne pouvez pas utiliser l'opérateur comme dans cassandra mais vous pouvez utiliser des opérateurs de plage et avec l'opérateur de plage, vous pouvez résoudre ce problème "comme 'quel que soit%'" "

Un exemple: j'ai plus d'un produit. Chaque produit a sa propre clé de partition (première partie de la clé primaire):

CREATE TABLE user(productId int, username text, PRIMARY KEY(productId, username));

Maintenant, j'ai quelques utilisateurs:

INSERT INTO user(productId, username) VALUES (1, 'anna');
INSERT INTO user(productId, username) VALUES (1, 'alpha');
INSERT INTO user(productId, username) VALUES (1, 'andreas');
INSERT INTO user(productId, username) VALUES (1, 'alex');
INSERT INTO user(productId, username) VALUES (1, 'bernd');
INSERT INTO user(productId, username) VALUES (1, 'bob');

Maintenant, je veux trouver tous les utilisateurs qui ont un a au début. Dans un monde SQL, j'utilise COMME 'a%' dans Cassandra j'utilise ceci:

SELECT * FROM user WHERE productId = 1 AND username >= 'a' AND username < 'b';

Le résultat:

productid | username
-----------+----------
     1 |     alex
     1 |    alpha
     1 |  andreas
     1 |     anna
14
Citrullin

Je suis tombé sur ce message alors que je cherchais une solution pour exécuter WHERE column_name LIKE '%keyword%' à Cassandra. Les réponses étaient prometteuses mais ne répondaient pas tout à fait à mon problème.

CREATE CUSTOM INDEX idx_name ON keyspace.columnfamily (column_name) 
USING 'org.Apache.cassandra.index.sasi.SASIIndex' 
WITH OPTIONS = {
'mode': 'CONTAINS', 
'analyzer_class': 'org.Apache.cassandra.index.sasi.analyzer.NonTokenizingAnalyzer', 
'case_sensitive': 'false'};

Dans le but de faire %keyword%(deux% s) fonctionne, l'index doit avoir des options avec mode: CONTAINS avec cela analyzer_class pour rendre case_sensitive efficace.

8
Kamyar