如何有效地交叉2个或更多的cassandra切片?

时间:2012-05-09 08:31:48

标签: cassandra

我正在使用this example

中显示的Posts和TaggedPosts列系列

我希望能够找到标记为“A”,“B”和“C”的帖子(例如)

问题是我必须用密钥A完全读取TaggedPosts,而不仅仅是获取前10个结果,如示例所示,然后与所有带标记B的TaggedPosts相交,不要错过一个等等

这是非常低效的,你会建议做什么?

我正在考虑更改TaggedPosts结构:并将Posts ID作为行键和

create colmun familty TaggedPosts with ... and column_metadata=[
    {column_name: tag1, ..., index_type: KEYS},
    {column_name: tag2, ..., index_type: KEYS},
    {column_name: tag3, ..., index_type: KEYS},

并且做:

get TaggedPosts where tag1=A and tag2=B and tag3=C;

但不确定它会比交叉/过滤客户端

更有效

1 个答案:

答案 0 :(得分:2)

我认为您案例的理想架构取决于您需要执行相交查询的频率,以及您是否需要能够快速获得任意一对标签或任意 N 标签,或者您是否只需要使用某些有限的标签。

如果我怀疑你希望能够查询匹配任意一组标签的帖子,那么可能没有比这样的架构(cql3)更好的解决方案:

CREATE COLUMNFAMILY TaggedPosts (
    tag text,
    post uuid,
    blog_rowentries_rowkey text,
    PRIMARY KEY (tag, post)
) WITH COMPACT STORAGE;

-- (note that this is the same actual data layout used in the "wtf is a supercolumn" article)

然后查询“带有A的帖子”,“带有B的帖子”等,如下所示:

SELECT * FROM TaggedPosts WHERE tag = 'A' LIMIT 100;
SELECT * FROM TaggedPosts WHERE tag = 'B' LIMIT 100;

..所以他们被单独查询,然后你合并客户端的结果。 100的限制可能不适合您的数据;理想值取决于标签重叠的可能性。它并不是为了保证您获得所需的所有结果,显然,它只是一个批量大小。如果找不到与所有标签匹配的足够帖子,则从具有最低uuid-times的标签中查询更多批次,直到您这样做。

在Solr索引的效率和编码简易性方面,您可以做得更好,因为这更像是一个全文搜索类型的问题,但您需要Datastax Enterprise或另一种自己整合Solr的方法。 (免责声明:我为Datastax工作。)

但是,我可以就此主题提出的最佳建议是不使用超级列。