SOLR-14552: Add BMW support to ReRank queries (#1559)

This commit is contained in:
Tomas Fernandez Lobbe 2020-06-10 14:59:50 -07:00 committed by GitHub
parent 138cdd758a
commit 9728f4ef20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 101 additions and 5 deletions

View File

@ -163,6 +163,8 @@ Optimizations
* SOLR-14472: Autoscaling "cores" preference now retrieves the core count more efficiently, and counts all cores.
(David Smiley)
* SOLR-14552: Add BlockMax-WAND support to ReRank queries (Tomás Fernández Löbbe)
Bug Fixes
---------------------
* SOLR-13264: IndexSizeTrigger aboveOp / belowOp properties not in valid properties.

View File

@ -45,8 +45,7 @@ import org.apache.solr.request.SolrRequestInfo;
@SuppressWarnings({"rawtypes"})
public class ReRankCollector extends TopDocsCollector {
@SuppressWarnings({"rawtypes"})
final private TopDocsCollector mainCollector;
final private TopDocsCollector<?> mainCollector;
final private IndexSearcher searcher;
final private int reRankDocs;
final private int length;
@ -71,11 +70,11 @@ public class ReRankCollector extends TopDocsCollector {
Sort sort = cmd.getSort();
if(sort == null) {
this.sort = null;
this.mainCollector = TopScoreDocCollector.create(Math.max(this.reRankDocs, length), Integer.MAX_VALUE);
this.mainCollector = TopScoreDocCollector.create(Math.max(this.reRankDocs, length), cmd.getMinExactCount());
} else {
this.sort = sort = sort.rewrite(searcher);
//scores are needed for Rescorer (regardless of whether sort needs it)
this.mainCollector = TopFieldCollector.create(sort, Math.max(this.reRankDocs, length), Integer.MAX_VALUE);
this.mainCollector = TopFieldCollector.create(sort, Math.max(this.reRankDocs, length), cmd.getMinExactCount());
}
this.searcher = searcher;
this.reRankQueryRescorer = reRankQueryRescorer;
@ -92,7 +91,7 @@ public class ReRankCollector extends TopDocsCollector {
@Override
public ScoreMode scoreMode() {
return sort == null || sort.needsScores() ? ScoreMode.COMPLETE : ScoreMode.COMPLETE_NO_SCORES;
return this.mainCollector.scoreMode();
}
@SuppressWarnings({"unchecked"})

View File

@ -17,9 +17,12 @@
package org.apache.solr.search;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.metrics.MetricsMap;
import org.apache.solr.metrics.SolrMetricManager;
@ -598,10 +601,12 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
params.add("start", "0");
params.add("rows", "2");
ignoreException("reRankQuery parameter is mandatory");
SolrException se = expectThrows(SolrException.class, "A syntax error should be thrown when "+ReRankQParserPlugin.RERANK_QUERY+" parameter is not specified",
() -> h.query(req(params))
);
assertTrue(se.code() == SolrException.ErrorCode.BAD_REQUEST.code);
unIgnoreException("reRankQuery parameter is mandatory");
}
@ -646,4 +651,94 @@ public class TestReRankQParserPlugin extends SolrTestCaseJ4 {
}
}
@Test
public void testMinExactCount() throws Exception {
assertU(delQ("*:*"));
assertU(commit());
int numDocs = 200;
for (int i = 0 ; i < numDocs ; i ++) {
assertU(adoc(
"id", String.valueOf(i),
"id_p_i", String.valueOf(i),
"field_t", IntStream.range(0, numDocs).mapToObj(val -> Integer.toString(val)).collect(Collectors.joining(" "))));
}
assertU(commit());
ModifiableSolrParams params = new ModifiableSolrParams();
params.add("q", "field_t:0");
params.add("start", "0");
params.add("rows", "10");
params.add("fl", "id");
assertQ(req(params),
"*[count(//doc)=10]",
"//result[@numFound='" + numDocs + "']",
"//result[@numFoundExact='true']",
"//result/doc[1]/str[@name='id'][.='0']",
"//result/doc[2]/str[@name='id'][.='1']",
"//result/doc[3]/str[@name='id'][.='2']",
"//result/doc[4]/str[@name='id'][.='3']",
"//result/doc[5]/str[@name='id'][.='4']",
"//result/doc[6]/str[@name='id'][.='5']",
"//result/doc[7]/str[@name='id'][.='6']",
"//result/doc[8]/str[@name='id'][.='7']",
"//result/doc[9]/str[@name='id'][.='8']",
"//result/doc[10]/str[@name='id'][.='9']"
);
params.add("rq", "{!"+ReRankQParserPlugin.NAME+" "+ReRankQParserPlugin.RERANK_QUERY+"=$rrq "+ReRankQParserPlugin.RERANK_DOCS+"=20}");
params.add("rrq", "id:10");
assertQ(req(params),
"*[count(//doc)=10]",
"//result[@numFound='" + numDocs + "']",
"//result[@numFoundExact='true']",
"//result/doc[1]/str[@name='id'][.='10']",
"//result/doc[2]/str[@name='id'][.='0']",
"//result/doc[3]/str[@name='id'][.='1']",
"//result/doc[4]/str[@name='id'][.='2']",
"//result/doc[5]/str[@name='id'][.='3']",
"//result/doc[6]/str[@name='id'][.='4']",
"//result/doc[7]/str[@name='id'][.='5']",
"//result/doc[8]/str[@name='id'][.='6']",
"//result/doc[9]/str[@name='id'][.='7']",
"//result/doc[10]/str[@name='id'][.='8']"
);
params.add(CommonParams.MIN_EXACT_COUNT, "2");
assertQ(req(params),
"*[count(//doc)=10]",
"//result[@numFound<='" + numDocs + "']",
"//result[@numFoundExact='false']",
"//result/doc[1]/str[@name='id'][.='10']",
"//result/doc[2]/str[@name='id'][.='0']",
"//result/doc[3]/str[@name='id'][.='1']",
"//result/doc[4]/str[@name='id'][.='2']",
"//result/doc[5]/str[@name='id'][.='3']",
"//result/doc[6]/str[@name='id'][.='4']",
"//result/doc[7]/str[@name='id'][.='5']",
"//result/doc[8]/str[@name='id'][.='6']",
"//result/doc[9]/str[@name='id'][.='7']",
"//result/doc[10]/str[@name='id'][.='8']"
);
params.add("sort", "score desc, id_p_i asc");
assertQ(req(params),
"*[count(//doc)=10]",
"//result[@numFound<='" + numDocs + "']",
"//result[@numFoundExact='false']",
"//result/doc[1]/str[@name='id'][.='10']",
"//result/doc[2]/str[@name='id'][.='0']",
"//result/doc[3]/str[@name='id'][.='1']",
"//result/doc[4]/str[@name='id'][.='2']",
"//result/doc[5]/str[@name='id'][.='3']",
"//result/doc[6]/str[@name='id'][.='4']",
"//result/doc[7]/str[@name='id'][.='5']",
"//result/doc[8]/str[@name='id'][.='6']",
"//result/doc[9]/str[@name='id'][.='7']",
"//result/doc[10]/str[@name='id'][.='8']"
);
}
}