我是Cassandra的新手,并试图弄清楚如何使用Cassandra获得一个简单的包含查询。
我的表格看起来像这样
CREATE TABLE events (
timekey text,
id timeuuid,
event_types list<text>,
PRIMARY KEY ((timekey), id)
)
我的查询:
cqlsh> select count(1) from events where event_types contains 'foo';
**Bad Request: line 1:46 no viable alternative at input 'contains'**
有关错误的任何想法?
还可以在一个查询中查询多个event_types。我无法通过Contains看到任何方法。在常规sql
中与此相当的东西关系SQL示例:
select count(1) from events where event_types in ('foo', 'bar')
答案 0 :(得分:2)
有几件事。首先,当我创建模式时,插入一行,我得到的错误信息与您不同:
aploetz@cqlsh:stackoverflow2> CREATE TABLE events (
... timekey text,
... id timeuuid,
... event_types list<text>,
... PRIMARY KEY ((timekey), id)
... );
aploetz@cqlsh:stackoverflow2> INSERT INTO events (timekey, id, event_types)
VALUES ('1', now(),['foo','bar']);
aploetz@cqlsh:stackoverflow2> select count(1) from events where event_types contains 'foo';
InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on the restricted
columns support the provided operators: "
要使其生效,您需要在event_types
集合上创建辅助索引。当然,集合上的二级索引是new feature as of Cassandra 2.1。由于您的错误消息不同,我猜您需要升级到2.1。
我现在正在沙盒中使用2.1.5,所以当我在event_types
上创建索引时,这可行:
aploetz@cqlsh:stackoverflow2> CREATE INDEX eventTypeIdx ON events(event_types);
aploetz@cqlsh:stackoverflow2> select count(1) from events where event_types contains 'foo';
count
-------
1
(1 rows)
即使这可能有效,但已知大型表或大型集群中的二级索引表现不佳。我希望集合上的二级索引表现得更差,所以只需将其作为警告。
是否可以在一个查询中查询多个event_types?
有很多方法可以实现这一目标,但我建议您针对上述性能问题采取相应措施。如果您有兴趣,我在这里回答了类似的问题:Cassandra CQL where clause with multiple collection values?