【问题标题】:Is there anyway to use LIKE in NoSQL Command on non primary Key?无论如何在非主键上的 NoSQL 命令中使用 LIKE 吗?
【发布时间】:2019-06-04 13:36:56
【问题描述】:
我在非主键上使用 LIKE 运算符从 Cassandra 数据库中进行选择。
select * from "TABLE_NAME" where "Column_name" LIKE '%SpO%' ALLOW FILTERING;
Error from server: code=2200 [Invalid query] message="LIKE restriction is only
supported on properly indexed columns. parameter LIKE '%SpO%' is not valid."
【问题讨论】:
标签:
cassandra
nosql
cql
cassandra-3.0
【解决方案1】:
简单地说,“是的”有一种方法可以在非主键组件上使用LIKE 进行查询。您可以使用 SASI(存储附加二级索引)索引来执行此操作。这是一个简单的例子:
CREATE TABLE testLike (key TEXT PRIMARY KEY, value TEXT) ;
CREATE CUSTOM INDEX valueIdx ON testLike (value)
USING 'org.apache.cassandra.index.sasi.SASIIndex'
WITH OPTIONS={'mode':'CONTAINS'};
由于您的查询需要匹配列中的字符串,而不仅仅是前缀或后缀,您需要在创建索引时传递CONTAINS 选项。
写入一些数据后,您的查询对我有用:
> SELECT * FROM testlike WHERE value LIKE '%SpO%';
key | value
-----+--------------
C | CSpOblahblah
D | DSpOblahblah
(2 rows)
警告!!!
此查询效率极低,并且可能会在大型集群中超时,除非您还在 WHERE 子句中按分区键进行过滤。重要的是要了解,虽然此功能的工作方式类似于关系数据库的工作方式,但 Cassandra 绝对不是关系数据库。它根本不适合处理会导致大量网络时间轮询多个节点以获取数据的查询。