我正在尝试在Cassandra中自己做CF反向索引,以进行geohash查找实现。
在CQL 2中,我可以这样做:
CREATE COLUMNFAMILY song_tags (id uuid PRIMARY KEY) WITH comparator=text;
insert into song_tags ('id', 'blues', '1973') values ('a3e64f8f-bd44-4f28-b8d9-6938726e34d4', '', '');
insert into song_tags ('id', 'covers', '2007') values ('8a172618-b121-4136-bb10-f665cfc469eb', '', '');
SELECT * FROM song_tags;
导致:
id,8a172618-b121-4136-bb10-f665cfc469eb | 2007, | covers,
id,a3e64f8f-bd44-4f28-b8d9-6938726e34d4 | 1973, | blues,
允许通过以下方式返回'封面'和'蓝调':
SELECT 'a'..'f' FROM song_tags
现在,我正在尝试使用CQL 3,它已经摆脱了动态列,并建议使用set或map列类型。集合和映射的值/键按字母顺序排列,并且引擎盖下(iirc)是列 - 因此,它们应该支持相同类型的范围切片......但是如何?
答案 0 :(得分:0)
建议忘记你对'引擎盖'实现细节的了解,并专注于查询语言允许你做什么。
为什么在CQL3中,多个行映射到单个columnfamily
,但查询语言将它们显示为不同的行。这只是查询相同数据的另一种方式。
范围切片不存在,查询语言足够灵活,可以支持其用例。
要执行您想要的操作,请在类型上创建索引,以便在不使用主键的情况下进行查询,然后选择类型值本身。
'gotcha'是某些功能只能在分区键上执行,如distinct
。在这种情况下,必须做distinct
客户端。
例如:
CREATE TABLE song_tags (
id uuid PRIMARY KEY,
year text,
genre list<text>
);
CREATE INDEX ON song_tags(genre);
INSERT INTO song_tags (id, year, genre)
VALUES(8a172618-b121-4136-bb10-f665cfc469eb, '2007', ['covers']);
INSERT INTO song_tags (id, year, genre)
VALUES(a3e64f8f-bd44-4f28-b8d9-6938726e34d4, '1973', ['blues']);
然后可以查询为:
SELECT genre from song_tags;
genre
------------
['blues']
['covers']