Emulating tinder you should expect a large amount of requests in a short period of time: swipe swipe click swipe click click click swipe swipe swipe where each one of these actions is generating the next profile result.
I would keep a document that is a list of all the profiles viewed. I wouldn't expect an individual users to vastly exceed 10,000 profiles viewed so even if the doc became several megabytes it should probably be fine. Lets call this the PastViewDoc
Next when the initially invoke their search I would execute the query against profiles that match age, location, whatever other filters you have and pull back anywhere from 10 to 100 profile results. I would chop out all profiles that match PastViewDoc and I would stick these results in the session or similar user scoped cache. I would then return 1 result. When the user moves to the next result, I would return 1 more result and keep popping off users from the profile queue you have in the session. Once you hit 0, you invoke the query again and rehydrate the queue. (You could get fancier and do this in the background, once the users hits some # say 10 profiles to go you background update the queue to have 10 + 100-PastViewDoc) At some point when they are saturating their area you may have to execute the paging into the result list multiple times until you get unique results (could potentially scale the page size when you're reaching starvation conditions).
The next upside, by pooling back the documents in chunks and sticking them in an in memory cache you can load those profiles from memory. It is very reasonable to expect profiles 1, 2, 3, 4, 5, 6 will all be viewed immediately. This eliminates large amounts of chatter with the database. A well designed application is "chunky" as opposed to "chatty" when it comes to IO calls.
This design would allow for easy horizontal scaling of the web tier by avoiding much tighter io bound coupling from most of the solutions here.
For social network applications queueing and background work is your friend, I would likely not have 1 synchronous action in this system EXCEPT "show next profile" which only hits an in memory cache. I would make sure all "likes", "view full profile", "update PastViewDoc", and "add users to profile queue" were all handled from queues asynchronously. I would only block if the call to next to profile is empty and block until I get a result (with a timeout if nothing happens soon).