If you happen to be one of about 4 people that actually reads this, you may notice I added a search box to the sidebar. What's far more interesting is the code behind it. I posted a snippet containing the code I wrote to accomplish this. Basically, it's just some convenience code to avoid having to drop down to SQL or use triggers for the simple case of having a model where you want certain fields to be full-text searchable. A SearchableModel will, by default, automatically update it's search index when you call its save() method. The API is documented at the top of the snippet, so I won't duplicate it here, but I will share the search view this site uses:

def search( request ):
    query = '&'.join( request.GET.get('q','').split() )
    entries = Entry.objects.search( query, rank_field='rank' )
    return render_template( request, 'search.html', {'entries': entries} )

Update: I added query parsing for multiple words in the view. Basically, all search words are ANDed together.

That's all there is to it. Keep in mind this is simply for making a single model searchable, it doesn't handle searching across relationships or custom indexing. But for simple cases, it does the trick quite nicely.