是否有任何与SQL相同的Cassandra查询:LIKE Con​​dition?

时间:2012-03-28 10:40:02

标签: sql cassandra pycassa

LIKE条件允许我们在SQL语句的where子句中使用通配符。这允许我们执行模式匹配。 LIKE条件可用于任何有效的SQL语句 - 选择,插入,更新或删除。喜欢这个

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

与上述操作相同,任何查询都可以在CLI中用于Cassandra。

5 个答案:

答案 0 :(得分:24)

自Cassandra 3.4(推荐3.5)以来,可以使用SSTable Attached Secondary Index(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';

然后前缀LIKE查询正在运行:

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

这些示例和更多配置选项(如后缀查询)可在documentation

中找到

可以找到有关SASI如何运作的更深入的解释here

答案 1 :(得分:14)

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

你不能在cassandra中使用like运算符,但你可以使用范围运算符,使用范围运算符可以解决这个问题“就像'不管%'”

一个例子: 我有多个产品。每个产品都有自己的分区键(主键的第一部分):

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中使用LIKE'a%',我使用它:

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

结果:

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

答案 2 :(得分:13)

简单回答:没有等效的 LIKE

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

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

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

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

行:用户名:bab - &gt; col:babu1,col:babar 行:用户名:babu - &gt;西:巴布尔

通过预先填充您通常在RDBMS世界中搜索的所有结果,您实际上是在作弊。与多年前相比,存储成本低廉......这就是为什么现在这是一种可接受的方法。检索预先填充的信息列表对CPU和内存的密集程度较低。

答案 3 :(得分:5)

当我在Cassandra中搜索执行WHERE column_name LIKE '%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% (两个%s)有效,索引必须包含模式的选项:CONTAINS 以及 analyzer_class < / strong>使 case_sensitive 生效。

答案 4 :(得分:0)

CQL LIKE语句位于Scylla Open Source 3.2 RC1中,Scylla是与CQL兼容的数据库Scylla的发行候选版。发布前,我们希望收到反馈。详细信息:

新的CQL LIKE关键字允许使用%作为通配符将任何列匹配到搜索模式。请注意,LIKE仅适用于ALLOW FILTERING。

LIKE语法支持:

'_'与任何单个字符匹配

'%'匹配任何子字符串(包括空字符串)

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

任何其他图案字符都匹配

空模式匹配空文本字段

例如:

  

插入t(id,名称)值(17,“ Mircevski”)

     

SELECT * FROM t,其中名称“ Mirc%”允许过滤

来源:4477 [RELEASE] Scylla 3.2 RC1