需要分页才能关注 Cassandra table

Need pagination for following Cassandra table

CREATE TABLE feed (
   identifier text,
   post_id int,
   score int,
   reason text,
   timestamp timeuuid,
   PRIMARY KEY ((identifier, post_id), score, id, timestamp)
) WITH CLUSTERING ORDER BY (score DESC, timestamp DESC);

CREATE INDEX IF NOT EXISTS index_identifier ON feed ( identifier );

我想要 运行 2 种类型的查询 where identifier = 'user_5' and post_id = 11;where identifier = 'user_5';

我想对每个查询的 10 个结果进行分页。但是,很少有查询可以具有可变的结果计数。所以最好有类似 *column* > last_record 的东西我可以使用。

请帮忙。提前致谢。

P.S: Cassandra 版本 - 3.11.6

首先,也是最重要的 - 您正在接近 Cassandra,就像在单个节点上运行的传统数据库一样。您的数据模型不支持为您的查询有效检索数据,二级索引也无济于事,因为它仍然需要到达所有节点以获取数据,因为数据将根据值分布在不同节点之间分区键((identifier, post_id) 在你的情况下) - 它可能适用于小型集群中的小数据,但当你扩展时会失败。

在 Cassandra 中,所有数据建模都从查询开始,所以如果您通过 identifier 进行查询,那么它应该是一个分区键(尽管如果某些用户会产生大分区,您可能会遇到一些问题很多消息)。在分区内你可以使用二级索引,这应该不是问题。另外,在分区内部更容易组织分页。 Cassandra原生支持向前分页,所以你只需要保持paging state between queries. In Java driver 4.6.0, the special helper class was added to support paging of results,虽然它可能不是很有效,因为它无论如何都需要从Cassandra读取数据,跳转到给定的页面,但至少它是一个帮助.这是文档中的示例:

String query = "SELECT ...";
// organize by 20 rows per page
OffsetPager pager = new OffsetPager(20);

// Get page 2: start from a fresh result set, throw away rows 1-20, then return rows 21-40
ResultSet rs = session.execute(query);
OffsetPager.Page<Row> page2 = pager.getPage(rs, 2);

// Get page 5: start from a fresh result set, throw away rows 1-80, then return rows 81-100
rs = session.execute(query);
OffsetPager.Page<Row> page5 = pager.getPage(rs, 5);