package querqy.solr.contrib; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Query; import org.apache.solr.SolrTestCaseJ4; import org.apache.solr.common.params.DisMaxParams; import org.apache.solr.request.SolrQueryRequest; import org.junit.BeforeClass; import org.junit.Test; import querqy.parser.WhiteSpaceQuerqyParser; import querqy.rewrite.RewriteChain; import querqy.solr.QuerqyDismaxQParser; @SolrTestCaseJ4.SuppressSSL public class QuerqyDismaxQParserWithSolrSynonymsTest extends SolrTestCaseJ4 { public static void index() throws Exception { assertU(adoc("id", "1", "f1", "a")); assertU(adoc("id", "2", "f1", "a")); assertU(adoc("id", "3", "f2", "a")); assertU(adoc("id", "4", "f1", "b")); assertU(commit()); } @BeforeClass public static void beforeTests() throws Exception { initCore("contrib/solrconfig-QuerqyDismaxQParserWithSolrSynonymsTest.xml", "schema.xml"); index(); } @Test public void testThatPFWorksWithSynonymRewriting() throws Exception { SolrQueryRequest req = req("q", "a b", DisMaxParams.QF, "f1 f2^0.9", DisMaxParams.PF, "f1^0.5", "defType", "querqy", "debugQuery", "true"); assertQ("ps with synonyms not working", req, "//str[@name='parsedquery'][contains(.,'PhraseQuery(f1:\"a b\")^0.5')]"); req.close(); } @Test public void testThatPF23FWorksWithSynonymRewriting() throws Exception { SolrQueryRequest req = req("q", "a b c d", DisMaxParams.QF, "f1 f2^0.9", DisMaxParams.PF2, "f1~2^2.1", DisMaxParams.PF3, "f2~3^3.9", "defType", "querqy", "debugQuery", "true"); assertQ("ps2/3 with synonyms not working", req, "//str[@name='parsedquery'][contains(.,'(f1:\"a b\"~2 f1:\"b c\"~2 f1:\"c d\"~2)^2.1')]", "//str[@name='parsedquery'][contains(.,'f2:\"a b c\"~3 f2:\"b c d\"~3)^3.9')]"); req.close(); } @Test public void testThatGeneratedTermsArePenalised() throws Exception { SolrQueryRequest req = req("q", "a b", DisMaxParams.QF, "f1^2", DisMaxParams.PF, "f1^0.5", QuerqyDismaxQParser.GFB, "0.8", "defType", "querqy", "debugQuery", "true"); assertQ(QuerqyDismaxQParser.GFB + " not working", req, "//str[@name='parsedquery'][contains(.,'f1:a^2.0 | f1:x^1.6')]", "//str[@name='parsedquery'][contains(.,'PhraseQuery(f1:\"a b\")^0.5')]"); req.close(); } @Test public void testThatGeneratedQueryFieldBoostsAreApplied() throws Exception { SolrQueryRequest req = req("q", "a", DisMaxParams.QF, "f1^2 f2^3", QuerqyDismaxQParser.GFB, "0.8", QuerqyDismaxQParser.GQF, "f2^10", "defType", "querqy", "debugQuery", "true"); assertQ("Generated query field boosts not working", req, "//str[@name='parsedquery'][contains(.,'f1:a^2.0 | f2:a^3.0 | f2:x^10.0')]" ); req.close(); } @Test public void testThatGeneratedQueryFieldsAreApplied() throws Exception { SolrQueryRequest req = req("q", "a", DisMaxParams.QF, "f1^2 f2^3", QuerqyDismaxQParser.GFB, "0.8", QuerqyDismaxQParser.GQF, "f2 f4", "defType", "querqy", "debugQuery", "true"); assertQ("Generated query fields not working", req, "//str[@name='parsedquery'][contains(.,'f1:a^2.0 | f2:a^3.0 | f2:x^2.4 | f4:x^0.8')]" ); req.close(); } public void verifyQueryString(SolrQueryRequest req, String q, String... expectedSubstrings) throws Exception { QuerqyDismaxQParser parser = new QuerqyDismaxQParser(q, null, req.getParams(), req, new RewriteChain(), new WhiteSpaceQuerqyParser(), null); Query query = parser.parse(); req.close(); assertTrue(query instanceof BooleanQuery); BooleanQuery bq = (BooleanQuery) query; String qStr = bq.toString(); for (String exp : expectedSubstrings) { assertTrue("Missing: " + exp, qStr.indexOf(exp) > -1); } } }