我想在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类型索引也无济于事。
这一切都可能吗?
答案 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不是一个好的选择。