package querqy.solr; import org.apache.solr.SolrTestCaseJ4; import org.apache.solr.common.params.DisMaxParams; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.search.QueryParsing; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; /** * Created by rene on 05/09/2016. */ @SolrTestCaseJ4.SuppressSSL public class ReRankBoostMethodTest extends SolrTestCaseJ4 { public void index() throws Exception { assertU(adoc("id", "1", "f1", "qup")); assertU(adoc("id", "2", "f1", "qup other", "f2", "u100")); assertU(commit()); } @BeforeClass public static void beforeTests() throws Exception { initCore("solrconfig-commonrules.xml", "schema.xml"); } @Override @Before public void setUp() throws Exception { super.setUp(); clearIndex(); index(); } @Test public void testThatReRankBringsBoostedDocToTop() throws Exception { String q = "qup"; SolrQueryRequest req = req("q", q, DisMaxParams.QF, "f1 f2", QueryParsing.OP, "OR", QuerqyDismaxQParser.QBOOST_METHOD, QuerqyDismaxQParser.QBOOST_METHOD_RERANK, "defType", "querqy", "debugQuery", "true" ); // doc 2 gets a better score by boosting f2:u100 assertQ("Result is not re-ranked", req, "//result[@name='response'][@numFound='2']", "//doc[1]/str[@name='id'][text()='2']", "//doc[2]/str[@name='id'][text()='1']", "//lst[@name='explain']/str[contains(.,'QuerqyReRankQuery')]" ); req.close(); // counter-check using edismax SolrQueryRequest req2 = req("q", q, DisMaxParams.QF, "f1 f2", QueryParsing.OP, "OR", "defType", "edismax", "debugQuery", "true" ); // doc 2 gets a worse score due to doc length normalisation assertQ("Edismax counter-check fails", req2, "//result[@name='response'][@numFound='2']", "//doc[1]/str[@name='id'][text()='1']", "//doc[2]/str[@name='id'][text()='2']", "//lst[@name='explain']/str[not(contains(.,'QuerqyReRankQuery'))]" ); req2.close(); } @Test public void testThatOnlyTopNDocsAreReRanked() throws Exception { String q = "qup"; SolrQueryRequest req = req("q", q, DisMaxParams.QF, "f1 f2", QueryParsing.OP, "OR", QuerqyDismaxQParser.QBOOST_METHOD, QuerqyDismaxQParser.QBOOST_METHOD_RERANK, QuerqyDismaxQParser.QBOOST_RERANK_NUMDOCS, "1", // try to re-rank only one doc --> will not change order "defType", "querqy", "debugQuery", "true" ); assertQ("bm.rerank.numDocs doesn't work", req, "//result[@name='response'][@numFound='2']", "//doc[1]/str[@name='id'][text()='1']", "//doc[2]/str[@name='id'][text()='2']", "//lst[@name='explain']/str[contains(.,'QuerqyReRankQuery')]" ); req.close(); // counter-check: re-rank both docs SolrQueryRequest req2 = req("q", q, DisMaxParams.QF, "f1 f2", QueryParsing.OP, "OR", QuerqyDismaxQParser.QBOOST_METHOD, QuerqyDismaxQParser.QBOOST_METHOD_RERANK, QuerqyDismaxQParser.QBOOST_RERANK_NUMDOCS, "2", // re-rank both docs "defType", "querqy", "debugQuery", "true" ); assertQ("bm.rerank.numDocs doesn't work", req2, "//result[@name='response'][@numFound='2']", "//doc[1]/str[@name='id'][text()='2']", "//doc[2]/str[@name='id'][text()='1']", "//lst[@name='explain']/str[contains(.,'QuerqyReRankQuery')]" ); req2.close(); } }