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

Bob*_*oid 24 sql cassandra pycassa

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

SELECT * FROM users
WHERE user_name like 'babu%';
Run Code Online (Sandbox Code Playgroud)

与上面相同的操作一样,任何查询都可以在CLI中用于Cassandra.

nst*_*low 26

自Cassandra 3.4(推荐3.5)以来,可以使用SSTable Attached Secondary Index(SASI)实现LIKE查询.

例如:

CREATE TABLE cycling.cyclist_name ( 
  id UUID PRIMARY KEY, 
  lastname text, 
  firstname text
);
Run Code Online (Sandbox Code Playgroud)

创建SASI如下:

CREATE CUSTOM INDEX  fn_prefix ON cyclist_name (firstname)
USING 'org.apache.cassandra.index.sasi.SASIIndex';
Run Code Online (Sandbox Code Playgroud)

然后前缀LIKE查询正在工作:

SELECT * FROM cyclist_name WHERE firstname LIKE 'M%';
SELECT * FROM cyclist_name WHERE firstname LIKE 'Mic%';
Run Code Online (Sandbox Code Playgroud)

这些示例和更多配置选项(如后缀查询)可以在文档中找到

有关SASI如何工作的更深入的解释可以在这里找到.


Cit*_*lin 16

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

你不能在cassandra中使用like运算符但是你可以使用范围运算符和范围运算符你可以解决这个"喜欢'无论%'"

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

CREATE TABLE user(productId int, username text, PRIMARY KEY(productId, username));
Run Code Online (Sandbox Code Playgroud)

现在我有一些用户:

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');
Run Code Online (Sandbox Code Playgroud)

现在,我想找到所有在开头都有a的用户.在SQL世界中,我在Cassandra中使用LIKE'a%'我使用:

SELECT * FROM user WHERE productId = 1 AND username >= 'a' AND username < 'b';
Run Code Online (Sandbox Code Playgroud)

结果:

productid | username
-----------+----------
     1 |     alex
     1 |    alpha
     1 |  andreas
     1 |     anna
Run Code Online (Sandbox Code Playgroud)

  • 但是此解决方案不能用于更长的字符串 (2认同)

sdo*_*lgy 13

简单的回答:没有相当的LIKE

http://www.datastax.com/docs/0.8/dml/using_cql

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

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

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

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

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

  • 我不认为这个答案是被接受的.实际上,如果要过滤的列是集群密钥,则会替换LIKE'something%':SELECT*FROM users WHERE user_name <='babu'AND user_name>'babv'; 请参阅@ PhilippBlum的回答 (4认同)

小智 9

我在寻找要WHERE column_name LIKE '%keyword%'在Cassandra中执行的解决方案时碰到了这篇文章。答案是有希望的,但不能完全解决我的问题。

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'};
Run Code Online (Sandbox Code Playgroud)

为了使%keyword% (两个%s)起作用,索引必须具有以下模式的选项:CONTAINS以及那个analyzer_class才能使case_sensitive有效。

  • 我想知道为什么没有人评价你的答案。到目前为止,该线程已被访问超过 35k。 (4认同)