If you are using time.After with a proper duration value for your timeout channel, it should be impossible that the select hangs forever.
What are your "searches"? If they are network requests, maybe it would be better to set a deadline on each request, to avoid having request that hang "indefinitely".
I don't see why you are closing both the resultsChannel and a done channel to signal that you are done, one channel should be sufficient...
unless you are delivering items on the resultsChannel, in which case it could be a bad idea to close it on timeout if there are other goroutines that could potentially be writing to it.