3

我正在使用 Posts 和 TaggedPosts 列族,如本例所示

我希望能够找到带有标签“A”、“B”和“C”的帖子(例如)

问题是我必须使用键 A 完全阅读 TaggedPosts,而不仅仅是获取前 10 个结果,如示例中所示,然后与所有使用键 B 的 TaggedPosts 相交,以免错过一个等等

它的效率非常低,您的建议离子命令是什么?

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

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;

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

4

1 回答 1

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 时间的标签中查询更多批次,直到找到为止。

您可以在效率和使用 Solr 索引的易编码性方面做得更好,因为这更像是一个全文搜索问题,但您需要 Datastax Enterprise 或其他方式自己集成 Solr。(免责声明:我为 Datastax 工作。)

不过,我能就该主题给出的最佳建议是不要使用超级列。

于 2012-05-09T18:31:52.943 回答