views:

67

answers:

4

I am using the Django query filter __search to perform a full text search e.g

MyModel.objects.filter(title__search = 'some title')

How do I get it to order by relevance, as currently it seems to be ordering alphabetically?

Specifically I would like search results where the title was some title to appear first before something that had the title a different but contains some title.

edit:

What I've noticed is that on the model definition for MyModel I have:

class Meta:
    ordering = ['title']

If I remove this then the ordering becomes correct i.e. sorted by relevance. So is there a way I can leave this in the model definition as its useful elsewhere but then on my query tell it to ignore it?

+1  A: 

As noticed here, the search is Boolean.

There's no such relevance coefficient to use for ordering.

A stupid idea can be ordering by title length, which can make sense.

Enrico Carlesso
A: 

For search result sorted by relevance, it will take a little more the the builtin boolean search. Here are two approaches (Sphinxsearch and Whoosh):

The MYYN
+2  A: 

The easiest way to get good fulltext search in a Django project is to use the excellent Haystack app. It's ridiculously easy to set up, especially if you use the simplest search engine backend (Whoosh, which is pure Python). You can set up fulltext indexing of your content, with relevance-ordered results and lots of other nice features besides, in a matter of minutes. And if you outgrow Whoosh's performance/concurrency/feature limitations, since you're using Haystack to abstract the search features you can swap in something like Solr for Whoosh anytime.

Carl Meyer
A: 

Try: Model.objects.all().order_by().search() - calling order_by without any parameters does no ordering at all.

Beyond that: I'll second Carl's recommendation of Haystack, particularly since that allows more complicated things like stemming ("dance" would match "dances" ,"dancers", and "dancing"), faceting ("Show me user & number of hits for each search result"), getting objects which are similar to the one you're currently displaying, etc. When I last tried Whoosh it was unstable (i.e. crashed during indexing) but it took a rather short period of time to fire up Solr, which is great.

Chris Adams
I've had pretty good luck with Whoosh recently. But it doesn't do all the fancy stuff: stemming yes, faceting no :(
Carl Meyer
I should note that my Whoosh experience was brief and about a year ago. I've heard it's stabilized since but haven't really needed it since we already needed Solr for various reasons (faceting, support for many languages).
Chris Adams