take a look at the postgres fulltext search capabilities, I can't make any promises for your old postgres version
another common approach is to index the search into elasticsearch and querying elasticsearch for the searches, it should handles misspellings and return the search results fast, but you may need to have a cluster of them with at least a couple of machines. I worked on a system once with single digits millions of entries with 6 machines (VM) running elasticsearch in a cluster, search results weren't fast but was reasonable. Once we had to re-index everything and it took a couple of days. We used django haystack, you should take a look at that. The problem with this approach is that you basically have a hook on the django model which copies some data over elasticsearch everytime you save()