setting asside for a moment my opionin that trying to do cut offs relative the max Score is a bad idea in general...
1) you're definitley not going to know the "topScore" until all of the matching docs are collected. 2) Solr really doesn't make it easy to plug in a custom Comparator - there is a lot of Solr code that assumes the one Collector Solr uses is always used -- you could write a custom RequestHandler that uses your own Collector, but you probably would have to jumpt through a lot of hoops. 3) since you need to examine all of hte matches to get the top score anyway, i owuld suggest you leave the COllection alone, and instead do your own DocList/DocSet merging. My approach would be sometihng like: 1) DocList aa = search(mainQuery, score desc, filter=criteriaA) 2) DocList bb = search(mainQuery, score desc, filter=-criteriaA) 3) pick top N from aa that have score higher then func(max(aa.maxScore,bb.maxScore)) 4) append everything else from aa and bb in sorted score order ...the devil is in the details, particularly how to deal with pagination and what kinds of practical size cut-offs you want to use for those aa and bb DocLists you'll be iterating over .. but that's the general apraoch i would try to start with. : I need to keep the best N documents - set A (chosen by some criteria - call : them sponsored docs) in front of the natural scoring docs - set B so that I : return (A,B). The set A docs need to all score above 1% of maxScore in B : else they join the B set, though I don't really know maxScore until I've : looked at all the docs. -Hoss