在相同的Cassandra查询中按AND LIKE排序

时间:2018-03-13 01:49:32

标签: cassandra cql

我想在cassandra表上执行此查询:

       select query,score,term  from mytable where term 
       like '%bottle%'  order by score desc limit 10;

表格中唯一的列是查询,分数,术语。

我按如下方式创建表:

CREATE TABLE mytable( "term" TEXT, "query" TEXT, "score" double,
PRIMARY KEY ("term","score")) WITH CLUSTERING ORDER BY (score desc);

我还有一个索引:

这会带来各种疯狂的错误。第一个是:

 InvalidRequest: code=2200 [Invalid query] message="LIKE restriction is
 only supported on properly indexed columns. term LIKE 'bottle' is not valid."

如果我用等号替换LIKE,则查询有效。但我需要LIKE和顺序。所以,经过一些谷歌搜索,我以为我会使用SASI索引。

CREATE CUSTOM INDEX term_idx2 ON mytable (term) USING
'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {   
'analyzer_class':
'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer',
'case_sensitive': 'false'};

这会产生另一条错误消息:

InvalidRequest: code=2200 [Invalid query] message=
"Cannot create secondary index on partition key column term"

行。这可能意味着如果我想使用LIKE,我不应该在" term"上创建二级索引。然后让我们尝试通过"查询"代替。查询变为:

       select query,score,term  from mytable where query 
       like '%bottle%'  order by score desc limit 10;

现在,这会产生"使用ALLOW FILTERING"错误。基本上导致我在查询上创建索引。即使在查询中创建SASI类型索引也无济于事。

这一切都可能吗?

1 个答案:

答案 0 :(得分:0)

  

不! 您不能在同一查询中使用所有订单

您已经知道无法在主键和群集键上创建索引。但是,您可以使用以下命令在其他列上创建索引,例如:query

CREATE CUSTOM INDEX mytable_query_idx  ON mytable ("query") 
USING 'org.apache.cassandra.index.sasi.SASIIndex'     
WITH OPTIONS = {'mode': 'CONTAINS', 
'analyzer_class': 'org.apache.cassandra.index.sasi.analyzer.StandardAnalyzer',
'case_sensitive': 'false'};

然后,您进行类似

的查询
SELECT * FROM mytable WHERE query LIKE '%abc%';

但是你不能在同一个查询中使用顺序喜欢,因为

  

“不支持使用第二个索引的ORDER BY。”

Howerver,如果你真的需要这些功能,Cassandra不是一个好的选择。