You could do it with sorting on a functionquery (which is supported from
solr 1.5)
http://wiki.apache.org/solr/FunctionQuery#Sort_By_Function
<http://wiki.apache.org/solr/FunctionQuery#Sort_By_Function>
Consider the search:
http://localhost:8093/solr/select?author:'j.k.rowling'

sorting like you specified would involve:

1. introducing an extra field: 'author_exact' of type 'string' which takes
care of the exact matching. (You can populate it by defining it as a
copyfield of Author so your indexing-code doesn't change)
2. set sortMissingLast="true" for 'num_copies' and 'num_comments'
like:  <fieldType
name="num_copies" sorMissingLast="true".... >

this makes sure that documents which don't have the value set end up at the
end of the sort when sorted on that particular field.

3. construct a functionquery that scores either 0 (no match)  or x (not sure
what x is (1?) , but it should always be the same for all exact matches )

This gives

http://localhost:8093/solr/select?author:'j.k.rowling'&sort=query({!dismaxqf=author_exact
v='j.k.rowling'}) desc

which scores all exact matches before all partial matches.

4. now just concatenate the other sorts giving:

http://localhost:8093/solr/select?author:'j.k.rowling'&sort=query({!dismaxqf=author_exact
v='j.k.rowling'}) desc, num_copies desc, num_comments desc

That should do it.

Please note that 'num_copies' and 'num_comments' still kick in to break the
tie for documents that exactly match on 'author_exact'. I assume this is
ok.

I can't see a way to do it without functionqueries at the moment, which
doesn't mean there isn't any.

Hope that helps,

Geert-Jan







*query({!dismax qf=text v='solr rocks'})*
*
*




2010/11/24 Robert Gründler <rob...@dubture.com>

> Hi,
>
> we have a requirement for one of our search results which has a quite
> complex sorting strategy. Let me explain the document first, using an
> example:
>
> The document is a book. It has several indexed text fields: Title, Author,
> Distributor. It has two integer columns, where one reflects the number of
> sold copies (num_copies), and the other reflects
> the number of comments on the website (num_comments).
>
> The Requirement for the relevancy looks like this:
>
> * Documents which have exact matches in the "Author" field, should be
> ranked highest, disregarding their values in "num_copies" and "num_comments"
> fields
> * After the exact matches, the sorting should be based on the value in the
> field "num_copies", but only for documents, where this field is set
> * After the num_copies matches, the sorting should be based on
> "num_comments"
>
> I'm wondering is this kind of sort order can be implemented in a single
> query, or if i need to break it down into several queries and merge the
> results on application level.
>
> -robert
>
>
>

Reply via email to