Hi Wenca,
I'm a bit late. but maybe you're still interested.
There's no such functionality in standard Solr. With sorting, this is
not possible, because sort functions only rank each single document,
they know nothing about the position of the others. And query elevation
is similar, you'll raise the score of independent documents.
To achive this, you'll need an own QueryComponent. This isn't too
complicated. You can't change the SolrIndexSearcher easily, this does
the search job. But you can subclass
org.apache.solr.handler.component.QueryComponent and overwrite
process(). Alas the single main line - searcher.search() - is buried
deeply in the huge monster method process(), and you first have to check
for shards, grouping and twentythousand other parameters until you've
arrived the code line you may want to expand.
Before calling search(), set the GET_DOCSET flag in your QueryCommand
object, then execute the search. To check whether there's a document of
the particular manufacturer in the result list, you can either
a) fetch the appropriate field value from the default field cache for
every single result document until you found one; or
b) call getDocSet() on the SolrIndexSearcher with the manufacturer query
as the parameter, and perform and and() operation on the resulting
DocSet with the DocSet of your main query. (That's why you set the flag
before.) You can then check which document that matches both the
manufacturer and the main query fits best.
If you found a matching document, but it's behind pos. 5 in the
resulting DocList, the you simoply have to re-order your list.
If there's no such document within the DocList (which is limited by your
rows parameter), but there are some in the joined DocSet from strategy
b), then you can simply choose one of them and ignore the fact that this
is probably not the best matching one. Or you have to patch Solr and
modify getDocListNC() in solrIndexSearcher (or one of the Collector
classes), which is much more complicated.
Good luck!
-Kuli
Am 29.05.2012 14:26, schrieb Wenca:
Hi all,
I have an index with thousands of products with various fields
(manufacturer, price, popularity, type, color, ...) and I want to
guarantee at least one product by a particular manufacturer to be within
the first 5 results.
The search is done mainly by using filter params and results are ordered
by function e.g.: "product(price, popularity) asc" or by "discount desc"
And I need to guarantee that if there is any product matching the given
filters made by a concrete manufacturer, then it will be on the 5th
position at worst, even if the position by the order function is worse.
It seems to me that the Query elevation component is not the right thing
for me. I don't know the query in advance (or the set of filter
criteria) and I don't know concrete product that will be the best for
the criteria within the order.
And also I don't think that I can construct a function with such
requirements to use it directly for ordering the results.
Of course I can make a second query in case there is no desired product
on the first page of results and put it there, but it requires
additional request to solr and complicates results processing and
further pagination.
Can anybody suggest any solution?
Thanks
Wenca