32

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

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

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

4

5 回答 5

38

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

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

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

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

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

于 2017-07-19T11:25:37.547 回答
21

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

您不能在 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 世界中,我在 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
于 2016-05-08T00:33:30.020 回答
19

我在寻找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'};

为了使%keyword% (两个 %s)起作用,索引必须具有mode: CONTAINS选项以及该analyzer_class以使case_sensitive有效。

于 2018-05-25T02:28:58.593 回答
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

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

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

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

于 2012-03-28T10:49:36.497 回答
2

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

  • CQL:LIKE 操作 # 4477

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

LIKE 语法支持:

'_' 匹配任何单个字符

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

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

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

空模式匹配空文本字段

例如:

插入 t (id, name) 值 (17, 'Mircevski')

SELECT * FROM t where name LIKE 'Mirc%' 允许过滤

资料来源:[发布] Scylla 3.2 RC1 2

于 2019-11-21T20:03:31.693 回答