One technique I’ve used for paginated queries over dynamic data is to have the initial request create a snapshot of the data, and then paginate over the snapshot.
In practice it looks something like /search?q=abc redirecting to /search/<uuid> and the next page link going to e.g. /search/<uuid>?cursor=<id>. The result set needs to be small-ish, O(100) maybe, and the snapshots need to have some kind of TTL, but if that works for your use case, then doing it this way makes for a pretty intuitive user experience.
One technique I’ve used for paginated queries over dynamic data is to have the initial request create a snapshot of the data, and then paginate over the snapshot.
In practice it looks something like
/search?q=abcredirecting to/search/<uuid>and the next page link going to e.g./search/<uuid>?cursor=<id>. The result set needs to be small-ish, O(100) maybe, and the snapshots need to have some kind of TTL, but if that works for your use case, then doing it this way makes for a pretty intuitive user experience.