Well a fun-fact is that Lucene doesn’t have really good way to do this, it just involves skipping to the point that you want to get the results from.
Thanks to .NET and LINQ we have extension methods which handles that nicely, Skip and Take, and since that the search results are IEnumerable underneath they can be used. But there’s one problem, doing this will result in a bit of a performance hit, as your initial Skip would hydrate a bunch of entities from the underlying Lucene store, which is where you loose performance.
So we implemented our own version of Skip! So you can just use Skip and Take as standard, and they’ll be evaluated without loosing performance.
Here’s the code:
int pageNumber = string.IsNullOrEmpty(Request.QueryString["pageNum"]) ? 0 : int.Parse(Request.QueryString["pageNum"]); int pageSize = 10; //this could be a config value or something /* serach snipped */ var results = searcher.Search(...); //And we'll just set a repeater with the results Repeater.DataSource = results.Skip(pageNumber * pageSize).Take(pageSize); Repeater.DataBind();
It's just that easy.