是否存在与SQL:LIKE条件相同的Cassandra查询?

是否存在与SQL:LIKE条件相同的Cassandra查询?,sql,cassandra,pycassa,Sql,Cassandra,Pycassa,LIKE条件允许我们在SQL语句的where子句中使用通配符。这允许我们执行模式匹配。LIKE条件可用于任何有效的SQL语句—select、insert、update或delete。像这样 SELECT * FROM users WHERE user_name like 'babu%'; 与上述相同的操作一样,在CLI中可以为Cassandra提供任何查询。简单回答:没有类似的查询 以下是v0.8的命令参考: 如果您维护另一组包含对用户名引用的行: 行:用户名:bab->col:babu1,c

LIKE条件允许我们在SQL语句的where子句中使用通配符。这允许我们执行模式匹配。LIKE条件可用于任何有效的SQL语句—select、insert、update或delete。像这样

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

与上述相同的操作一样,在CLI中可以为Cassandra提供任何查询。

简单回答:没有类似的查询

以下是v0.8的命令参考:

如果您维护另一组包含对用户名引用的行:

行:用户名:bab->col:babu1,col:babar 行:用户名:babu->col:babur


实际上,通过预先填充RDBMS世界中通常搜索的所有结果,您是在作弊。与几年前相比,存储是便宜的。。。这就是为什么现在这是一个被接受的方法。检索预先填充的信息列表对CPU和内存的占用较少。

我知道:这是一个老问题,但有一个解决方案:

在cassandra中不能使用like运算符,但可以使用range运算符,使用range运算符可以像“whatever%”一样解决这个问题

例如: 我有不止一种产品。每个产品都有自己的分区键主键的第一部分:

CREATE TABLE user(productId int, username text, PRIMARY KEY(productId, username));
现在我有一些用户:

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');
现在,我想找到所有在开始时有a的用户。在SQL世界中,我像Cassandra中的“a%”一样使用:

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

由于建议使用Cassandra 3.4 3.5,因此可以使用SSTable附加的二级索引SASI实现LIKE查询

例如:

CREATE TABLE cycling.cyclist_name ( 
  id UUID PRIMARY KEY, 
  lastname text, 
  firstname text
);
按如下方式创建SASI:

CREATE CUSTOM INDEX  fn_prefix ON cyclist_name (firstname)
USING 'org.apache.cassandra.index.sasi.SASIIndex';
然后,类似前缀的查询正在工作:

SELECT * FROM cyclist_name WHERE firstname LIKE 'M%';
SELECT * FROM cyclist_name WHERE firstname LIKE 'Mic%';
这些示例和更多配置选项(如后缀查询)可以在


可以找到有关SASI工作原理的更深入的解释。

我在搜索解决方案以执行Cassandra中列名称“%keyword%”的位置时,遇到了这篇文章。答案是有希望的,但并没有完全解决我的问题

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'};

为了使%keyword%two%s起作用,索引必须具有mode:CONTAINS选项以及analyzer类,以使区分大小写的有效性。

CQL类语句位于Scylla开源3.2 RC1中,Scylla的候选版本,CQL兼容的数据库。我们希望在发布前得到反馈。详情如下:

CQL:类操作 新的CQL-LIKE关键字允许将任何列与搜索模式匹配,使用%作为通配符。请注意,LIKE仅适用于允许过滤

与语法支持类似:

“\”匹配任何单个字符

“%”匹配包括空字符串在内的任何子字符串

“\”转义下一个模式字符,因此它与逐字匹配

任何其他模式字符都与自身匹配

空模式匹配空文本字段

例如:

CREATE TABLE cycling.cyclist_name ( 
  id UUID PRIMARY KEY, 
  lastname text, 
  firstname text
);
在t id中插入名称值17“Mircevski”

选择*FROM t,其中的名称如“Mirc%”允许筛选


资料来源:

sdolgy是对的。或者,看看solandra或DSE之类的东西。但是这个解决方案不能用于更长的字符串。如果我想查询单词,我应该怎么做?我猜这个解决方案不好,对吧?是的,你是对的。这一解决方案仅限于文字。问题是:像“babu%”这样的用户名在哪里;在这种情况下,您可以使用此解决方案。对于查询单词,您可以使用弹性搜索。如何查找%search word%之类的内容?请注意,它应该是username>='a',因为如果您在SQL中有像'a%'这样的用户名,则'a'是匹配项。当然,你可以匹配单词。user_name>=“baby”也可以正常工作。事实上,我已经用过很多次了。我不会把这个答案标记为接受。实际上,如果要筛选的列是一个集群键,则有一个类似“something%”的替换项:SELECT*FROM users,其中user_name“babv”;请看@PhilippBlum的回答我有一段时间没有研究过这个问题了。我必须在你的回答中补充一点。现在可以通过二级索引来实现,但我不会依赖它,因为它不是Cassandra的核心功能。如果我开始使用这些动态查询,我会考虑在另一个存储系统中使用重复数据集。一个为这些查询而优化的系统。@Citrullin我同意。如果这些查询被大量使用,那么为其定制的系统肯定更适合。我使用它作为概念验证研究项目UI的一部分,在Cassandra中按名称过滤数据。这可以用于Apache Cassandra还是仅用于Datastax企业版?文档对此并不清楚。@dev7我非常确定这是Apache Cassandra的一部分。如果你需要大量依赖二级索引,你应该考虑使用额外的服务,比如DATASAX提供,或者SOLR可以帮助。@ NSTReloo谢谢,是的,我们确实可以使用它作为Apache Casdand的一部分。出于某种原因-我们遇到的所有关于它的文档都是
企业版的一部分我想知道为什么没有人给你的答案打分。到目前为止,该线程的访问量已超过35k。它可以与Apache Cassandra一起使用,还是仅与Datastax企业版一起使用?文档对此并不清楚。它可以与Apache Cassandra一起使用