该LIKE
条件允许我们在 SQL 语句的 where 子句中使用通配符。这使我们能够执行模式匹配。该LIKE
条件可用于任何有效的 SQL 语句 - 选择、插入、更新或删除。像这样
SELECT * FROM users
WHERE user_name like 'babu%';
与上述相同的操作一样,任何查询都可用于 CLI 中的 Cassandra。
从 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 工作原理的更深入解释。
我知道:这是一个老问题,但这个话题有一个解决方案:
您不能在 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
我在寻找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有效。
简单的回答:没有等价的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 和内存的占用较少。
CQL LIKE 语句在 Scylla Open Source 3.2 RC1 中,这是 Scylla 的候选版本,这是一个与 CQL 兼容的数据库。我们希望在发布前得到反馈。这是详细信息:
新的 CQL LIKE 关键字允许将任何列与搜索模式匹配,使用 % 作为通配符。请注意,LIKE 仅适用于 ALLOW FILTERING。
LIKE 语法支持:
'_' 匹配任何单个字符
'%' 匹配任何子字符串(包括空字符串)
'\' 转义下一个模式字符,因此它逐字匹配
任何其他模式字符匹配自身
空模式匹配空文本字段
例如:
插入 t (id, name) 值 (17, 'Mircevski')
SELECT * FROM t where name LIKE 'Mirc%' 允许过滤
资料来源:[发布] Scylla 3.2 RC1 2