cassandraMap查询

z2acfund  于 2021-06-15  发布在  Cassandra
关注(0)|答案(1)|浏览(391)

我有一张有下一栏的table,

name text, //partition key
tags map<text, text>

我还有一个关于“标签”列的二级索引。现在我想问一下,

select * from <table_name> where tags contains {'a':'b','x':'y'}

有可能吗?如果不是,我可以只使用“contains{'a':'b'}”进行查询吗?
这个设计不好吗?如果是,如何纠正(注:名称与标记有1->n关系)

gcxthw6b

gcxthw6b1#

问题1
对于Map集合,cassandra允许在键、值或条目上创建索引(这仅适用于Map)。
因此,首先要在Map上创建索引:

CREATE INDEX <index_name> ON <table_name> (ENTRIES(<map_column>));

然后您可以查询:

SELECT * FROM <table_name> WHERE <map_column>['<map_key>'] = '<map_value>';

另一种解决方案是冻结集合并在其上创建索引:

CREATE INDEX <index_name> ON table (FULL(<map_column>));

然后,您可以通过以下方式查询值:

SELECT * FROM <table_name> WHERE <map_column> = ['<value>'...];

我认为上面的解决方案不是很好,因为你可以很容易地扫描整个集群。您的访问类型将使用和索引,而不是分区键。
问题2
另一种解决方案是创建如下表:

CREATE TABLE <table_name> ( key TEXT, value TEXT, name TEXT, PRIMARY KEY ((key, value), name));

键和值列将保存标记的值。它们也是分区键,因此您可以查询数据,如:

SELECT * FROM <table_name> WHERE key = 'key' AND value = 'value';

为了搜索所有标记,您将需要运行几个查询,但是您可以在应用程序级别聚合结果。

相关问题