/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.solr; import org.apache.solr.common.params.CommonParams; import org.junit.BeforeClass; import org.junit.Test; import java.util.regex.Pattern; /** * Tests some basic functionality of the DisMaxRequestHandler */ public class DisMaxRequestHandlerTest extends SolrTestCaseJ4 { @BeforeClass public static void beforeClass() throws Exception { initCore("solrconfig.xml","schema.xml"); lrf = h.getRequestFactory ("dismax", 0, 20, CommonParams.VERSION,"2.2", "facet", "true", "facet.field","t_s" ); /** Add some documents to the index */ assertNull(h.validateUpdate(adoc("id", "666", "features_t", "cool and scary stuff", "subject", "traveling in hell", "t_s", "movie", "title", "The Omen", "weight", "87.9", "iind", "666"))); assertNull(h.validateUpdate(adoc("id", "42", "features_t", "cool stuff", "subject", "traveling the galaxy", "t_s", "movie", "t_s", "book", "title", "Hitch Hiker's Guide to the Galaxy", "weight", "99.45", "iind", "42"))); assertNull(h.validateUpdate(adoc("id", "1", "features_t", "nothing", "subject", "garbage", "t_s", "book", "title", "Most Boring Guide Ever", "weight", "77", "iind", "4"))); assertNull(h.validateUpdate(adoc("id", "8675309", "features_t", "Wikedly memorable chorus and stuff", "subject", "One Cool Hot Chick", "t_s", "song", "title", "Jenny", "weight", "97.3", "iind", "8675309"))); assertNull(h.validateUpdate(commit())); } @Test public void testSomeStuff() throws Exception { doTestSomeStuff("dismax"); } public void doTestSomeStuff(final String qt) throws Exception { assertQ("basic match", req("guide") ,"//*[@numFound='2']" ,"//lst[@name='facet_fields']/lst[@name='t_s']" ,"*[count(//lst[@name='t_s']/int)=3]" ,"//lst[@name='t_s']/int[@name='book'][.='2']" ,"//lst[@name='t_s']/int[@name='movie'][.='1']" ); assertQ("basic cross field matching, boost on same field matching", req("cool stuff") ,"//*[@numFound='3']" ,"//result/doc[1]/int[@name='id'][.='42']" ,"//result/doc[2]/int[@name='id'][.='666']" ,"//result/doc[3]/int[@name='id'][.='8675309']" ); assertQ("multi qf", req("q", "cool" ,"qt", qt ,CommonParams.VERSION, "2.2" ,"qf", "subject" ,"qf", "features_t" ) ,"//*[@numFound='3']" ); assertQ("multi qf as local params", req("q", "{!dismax qf=subject qf=features_t}cool") ,"//*[@numFound='3']" ); assertQ("boost query", req("q", "cool stuff" ,"qt", qt ,CommonParams.VERSION, "2.2" ,"bq", "subject:hell^400" ) ,"//*[@numFound='3']" ,"//result/doc[1]/int[@name='id'][.='666']" ,"//result/doc[2]/int[@name='id'][.='42']" ,"//result/doc[3]/int[@name='id'][.='8675309']" ); assertQ("multi boost query", req("q", "cool stuff" ,"qt", qt ,CommonParams.VERSION, "2.2" ,"bq", "subject:hell^400" ,"bq", "subject:cool^4" , CommonParams.DEBUG_QUERY, "true" ) ,"//*[@numFound='3']" ,"//result/doc[1]/int[@name='id'][.='666']" ,"//result/doc[2]/int[@name='id'][.='8675309']" ,"//result/doc[3]/int[@name='id'][.='42']" ); assertQ("minimum mm is three", req("cool stuff traveling") ,"//*[@numFound='2']" ,"//result/doc[1]/int[@name='id'][. ='42']" ,"//result/doc[2]/int[@name='id'][. ='666']" ); assertQ("at 4 mm allows one missing ", req("cool stuff traveling jenny") ,"//*[@numFound='3']" ); assertQ("relying on ALTQ from config", req( "qt", qt, "fq", "id:666", "facet", "false" ) ,"//*[@numFound='1']" ); assertQ("explicit ALTQ", req( "qt", qt, "q.alt", "id:9999", "fq", "id:666", "facet", "false" ) ,"//*[@numFound='0']" ); assertQ("no query slop == no match", req( "qt", qt, "q", "\"cool chick\"" ) ,"//*[@numFound='0']" ); assertQ("query slop == match", req( "qt", qt, "qs", "2", "q", "\"cool chick\"" ) ,"//*[@numFound='1']" ); } @Test public void testExtraBlankBQ() throws Exception { // if the boost queries are in their own boolean query, the clauses will be // surrounded by ()'s in the debug output Pattern p = Pattern.compile("subject:hell\\s*subject:cool"); Pattern p_bool = Pattern.compile("\\(subject:hell\\s*subject:cool\\)"); String resp = h.query(req("q", "cool stuff" ,"qt", "dismax" ,CommonParams.VERSION, "2.2" ,"bq", "subject:hell OR subject:cool" ,CommonParams.DEBUG_QUERY, "true" )); assertTrue(p.matcher(resp).find()); assertFalse(p_bool.matcher(resp).find()); resp = h.query(req("q", "cool stuff" ,"qt", "dismax" ,CommonParams.VERSION, "2.2" ,"bq", "subject:hell OR subject:cool" ,"bq","" ,CommonParams.DEBUG_QUERY, "true" )); assertTrue(p.matcher(resp).find()); assertTrue(p_bool.matcher(resp).find()); } }