0
votes

I want to demote all documents that have inv=0(possible values from 0 to 1000) to the end of the result set. i have got other sorting options like name desc also as part of the query.

For example below are my solr documents

Doc1 : name=apple , Inv=2
Doc2 : name=ball , Inv=1
Doc3 : name=cat , Inv=0
Doc4 : name=dog , Inv=0
Doc5 : name=fish , Inv=4
Doc6 : name=Goat , Inv=5

I want achieve below sorting ...here, i want to push all documents with inv=0 down to bottom and then apply "name asc" sorting.

Doc1
Doc2
Doc5
Doc6
Doc3
Doc4

my solr request is like

bq: "(: AND -inv:"0")^999.0" & defType: "edismax"

here 999 is the rank that i gave to demote results.

this boosting query works fine. it moves all documents with inv=0 down to the bottom.

But when i add &sort=name asc to the solr query, it prioritizes "sort" over bq..i am seeing below results with "name asc".

Doc1 : name=apple , Inv=2
Doc2 : name=ball , Inv=1
Doc3 : name=cat , Inv=0
Doc4 : name=dog , Inv=0
Doc5 : name=fish , Inv=4
Doc6 : name=Goat , Inv=5

can anyone please help me out. ?

2

2 Answers

3
votes

Sort will override the boost.

So, you either move your sort into boost by making that condition map into boost values.

Or you move your boost condition into sort, using query() syntax. This was one of the gems from the Lucene/Solr Revolution 2016 presentation by hoss (click start presentation):

        qq = Harry
         q = +{!edismax v=$qq}
        qf = title actor writer director  keywords
      sort = query($title_sort,0) desc, title asc
title_sort = {!field f=title v=$qq}
1
votes

Default sorting criteria in Solr is score desc, where score is a virtual field and it actually represents the document's score.
Once one is passing &sort=name asc it will override default sorting.

Possible solution here might be something like this: &sort=score desc, name asc. Which literally means: please sort by score first and for documents with equal score please make a tie-break by name ascending.

It should work as long as you will have equal scores for doc1, doc2, doc5, doc6.

If it is not the case - then check out this Solr Wiki link for more details how to penalize docs with inv:0.