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

35

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

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

与上述操作类似,在CLI中对Cassandra可用的任何查询都是可用的。


sdolgy是正确的。或者,可以考虑使用solandra或DSE。 - phact
Cassandra的新版本允许这样做,只需正确定义索引即可:https://stackoverflow.com/questions/76463629/spring-data-cassandra-like-query-on-secondary-indexed-cluster-column - Aaron
Cassandra的新版本允许这样做,只需正确定义索引即可:https://stackoverflow.com/questions/76463629/spring-data-cassandra-like-query-on-secondary-indexed-cluster-column - undefined
5个回答

40

自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%';
这些示例和更多配置选项,例如后缀查询,可以在文档中找到。
关于SASI如何工作的更深入解释,请参见这里

1
有一段时间没有研究这个问题了。我需要在你的答案中添加一件事情。现在你可以通过二级索引来完成它,但我不会依赖它,因为它不是Cassandra的核心功能。如果我开始使用这种动态查询,我会考虑在另一个存储系统中使用重复数据集。一个专门针对这种查询进行优化的系统。 - Citrullin
1
@Citrullin 我同意。如果这些查询被广泛使用,那么专门针对此类查询的系统肯定更适合。我将其用作概念验证研究项目 UI 的一部分,以在 Cassandra 中按名称过滤数据。 - nstrelow
这个能和Apache Cassandra一起使用还是只能和Datastax Enterprise版本一起使用?文档没有明确说明。 - dev7
@dev7 我非常确定这是 Apache Cassandra 的一部分。如果您需要大量依赖该二级索引,您应该考虑使用像 Datastax 提供的附加服务或者 Solr 可能会有所帮助。 - nstrelow
@nstrelow 谢谢,是的,我们确实能够将其作为 Apache Cassandra 的一部分使用。不知何故,我们遇到的所有文档都是企业版的一部分。 - dev7

23
我在寻找一种在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) 生效,索引必须具有mode: CONTAINS选项以及analyzer_class,以使case_sensitive生效。

4
我想知道为什么没有人给你的回答评分。这个帖子到现在为止已经有超过35k的访问量。 - supritshah1289
这个能和Apache Cassandra一起使用还是只能和Datastax Enterprise版本一起使用?文档没有明确说明。 - dev7
它可以与Apache Cassandra一起使用。 - Jibin Mathews

22

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

在cassandra中不能使用like运算符,但可以使用范围运算符,并且使用范围运算符,您可以解决类似于“like '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中,我使用LIKE 'a%',在Cassandra中我使用以下查询语句:

SELECT * FROM users WHERE username >= 'a' AND username < 'b';

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

结果:

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

6
但这种解决方案无法用于较长的字符串。 - user1585121
如果我想查询单词,应该怎么做呢?我猜这个解决方案不太好,对吧? - user1585121
是的,你是对的。这个解决方案受到词语限制。问题的情况是:WHERE user_name like 'babu%'; 而且你可以在这些情况下使用这个解决方案。对于查询词,你可以使用Elasticsearch。 - Citrullin
我要如何找到类似于“%搜索词%”这样的东西? - Amit Mahajan
1
请注意,在 SQL 中,如果您使用 username LIKE 'a%',则应该是 username >= 'a',因为 a 是匹配项。当然,您也可以匹配单词。user_name >= 'baby' 也能正常工作。实际上,我已经多次使用了这个方法。 - Alexis Wilke
显示剩余2条评论

15
简单回答:没有与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

如果你维护另一组包含对用户名的引用的行:
行:username:bab -> col:babu1,col:babar 行:username:babu -> col:babur 实际上,你通过预先填充在RDBMS世界中通常搜索的所有结果来作弊。与多年前相比,存储成本较低…这就是为什么现在这是一种被接受的方法。使用预填充信息列表检索信息对CPU和内存的要求较少。

4
我不会将这个答案标记为被接受的。实际上,如果您筛选的列是聚集键,则可以替换LIKE 'something%'。 SELECT * FROM users WHERE user_name <= 'babu' AND user_name>'babv'; 请参见@PhilippBlum的答案。 - Yahor

2

CQL的LIKE语句出现在Scylla Open Source 3.2 RC1中,这是一个兼容CQL的数据库Scylla的发布候选版。我们希望在发布之前得到反馈意见。以下是详细信息:

  • CQL:LIKE操作#4477

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

LIKE语法支持:

'_'匹配任何单个字符

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

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

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

空模式匹配空文本字段

例如:

INSERT INTO t (id, name) VALUES (17, ‘Mircevski’)

SELECT * FROM t where name LIKE 'Mirc%' allow filtering

来源:[RELEASE] Scylla 3.2 RC1 2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接