blob: 0ce6179ec6284630a2be56555b1e18086fe716c3 [file] [log] [blame]
/*
* 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.search;
import org.apache.solr.SolrTestCaseJ4;
import org.junit.BeforeClass;
import org.junit.Test;
/** Simple tests for SimpleQParserPlugin. */
public class TestSimpleQParserPlugin extends SolrTestCaseJ4 {
@BeforeClass
public static void beforeClass() throws Exception {
initCore("solrconfig-basic.xml","schema-simpleqpplugin.xml");
index();
}
public static void index() throws Exception {
assertU(adoc("id", "42", "text0", "t0 t0 t0", "text1", "t0 t1 t2", "text-keyword0", "kw0 kw0 kw0"));
assertU(adoc("id", "43", "text0", "t0 t1 t2", "text1", "t3 t4 t5", "text-keyword0", "kw0 kw1 kw2"));
assertU(adoc("id", "44", "text0", "t0 t1 t1", "text1", "t6 t7 t8", "text-keyword0", "kw3 kw4 kw5"));
assertU(adoc("id", "45", "text0", "t0 t0 t1", "text1", "t9 t10 t11", "text-keyword0", "kw6 kw7 kw8"));
assertU(adoc("id", "46", "text0", "t1 t1 t1", "text1", "t12 t13 t14", "text-keyword0", "kw9 kw10 kw11"));
assertU(adoc("id", "47", "text0", "and", "text1", "+", "text-keyword0", "+"));
assertU(adoc("id", "48", "text0", "not", "text1", "-", "text-keyword0", "-"));
assertU(adoc("id", "49", "text0", "or", "text1", "|", "text-keyword0", "|"));
assertU(adoc("id", "50", "text0", "prefix", "text1", "t*", "text-keyword0", "kw*"));
assertU(adoc("id", "51", "text0", "phrase", "text1", "\"", "text-keyword0", "\""));
assertU(adoc("id", "52", "text0", "open", "text1", "(", "text-keyword0", "("));
assertU(adoc("id", "53", "text0", "close", "text1", ")", "text-keyword0", ")"));
assertU(adoc("id", "54", "text0", "escape", "text1", "\\", "text-keyword0", "\\"));
assertU(adoc("id", "55", "text0", "whitespace", "text1", "whitespace", "text-keyword0", " "));
assertU(adoc("id", "56", "text0", "whitespace", "text1", "whitespace", "text-keyword0", "\n"));
assertU(adoc("id", "57", "text0", "foobar", "text1", "foo bar", "text-keyword0", "fb"));
assertU(adoc("id", "58", "text-query0", "HELLO"));
assertU(adoc("id", "59", "text-query0", "hello"));
assertU(commit());
}
@Test
public void testQueryFields() throws Exception {
assertJQ(req("defType", "simple", "qf", "text0^2 text1 text-keyword0", "q", "t3"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0^3 text1^4 text-keyword0^0.55", "q", "t0"), "/response/numFound==4");
assertJQ(req("defType", "simple", "qf", "text-keyword0^9.2", "q", "\"kw9 kw10 kw11\""), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text-keyword0", "q", "kw9 kw10 kw11"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text1 text-keyword0", "q", "kw9"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0", "q", "t2"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0^1.1 text1^0.9", "q", "t2 t9 t12"), "/response/numFound==4");
}
@Test
public void testDefaultField() throws Exception {
assertJQ(req("defType", "simple", "df", "text0", "q", "t2 t9 t12"), "/response/numFound==1");
assertJQ(req("defType", "simple", "df", "text0", "q", "t3"), "/response/numFound==0");
assertJQ(req("defType", "simple", "df", "text1", "q", "t2 t9 t12"), "/response/numFound==3");
assertJQ(req("defType", "simple", "df", "text1", "q", "t3"), "/response/numFound==1");
assertJQ(req("defType", "simple", "df", "text-keyword0", "q", "\"kw9 kw10 kw11\""), "/response/numFound==1");
assertJQ(req("defType", "simple", "df", "text-keyword0", "q", "kw9 kw10 kw11"), "/response/numFound==0");
}
@Test
public void testQueryFieldPriority() throws Exception {
assertJQ(req("defType", "simple", "qf", "text0^2 text1 text-keyword0", "df", "text0", "q", "t3"), "/response/numFound==1");
}
@Test
public void testOnlyAndOperatorEnabledDisabled() throws Exception {
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "+",
"q.operators", "NOT, OR, PHRASE, PREFIX, PRECEDENCE, ESCAPE, WHITESPACE"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "-",
"q.operators", "NOT, OR, PHRASE, PREFIX, PRECEDENCE, ESCAPE, WHITESPACE"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "+",
"q.operators", "AND"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "-",
"q.operators", "AND"), "/response/numFound==1");
}
@Test
public void testOnlyNotOperatorEnabledDisabled() throws Exception {
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "-",
"q.operators", "AND, OR, PHRASE, PREFIX, PRECEDENCE, ESCAPE, WHITESPACE"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "|",
"q.operators", "AND, OR, PHRASE, PREFIX, PRECEDENCE, ESCAPE, WHITESPACE"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "-",
"q.operators", "NOT"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "|",
"q.operators", "NOT"), "/response/numFound==1");
}
@Test
public void testOnlyOrOperatorEnabledDisabled() throws Exception {
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "|",
"q.operators", "AND, NOT, PHRASE, PREFIX, PRECEDENCE, ESCAPE, WHITESPACE"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "\"",
"q.operators", "AND, NOT, PHRASE, PREFIX, PRECEDENCE, ESCAPE, WHITESPACE"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "|",
"q.operators", "OR"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "\"",
"q.operators", "OR"), "/response/numFound==1");
}
@Test
public void testOnlyPhraseOperatorEnabledDisabled() throws Exception {
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "\"",
"q.operators", "AND, NOT, OR, PREFIX, PRECEDENCE, ESCAPE, WHITESPACE"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "|",
"q.operators", "AND, NOT, OR, PREFIX, PRECEDENCE, ESCAPE, WHITESPACE"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "\"",
"q.operators", "PHRASE"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "|",
"q.operators", "PHRASE"), "/response/numFound==1");
}
@Test
public void testOnlyPrefixOperatorEnabledDisabled() throws Exception {
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "t*",
"q.operators", "AND, NOT, OR, PHRASE, PRECEDENCE, ESCAPE, WHITESPACE"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "(",
"q.operators", "AND, NOT, OR, PHRASE, PRECEDENCE, ESCAPE, WHITESPACE"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "t*",
"q.operators", "PREFIX"), "/response/numFound==6");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "(",
"q.operators", "PREFIX"), "/response/numFound==1");
}
@Test
public void testOnlyPrecedenceOperatorEnabledDisabled() throws Exception {
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "(",
"q.operators", "AND, NOT, OR, PHRASE, PREFIX, ESCAPE, WHITESPACE"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "\\",
"q.operators", "AND, NOT, OR, PHRASE, PREFIX, ESCAPE, WHITESPACE"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "(",
"q.operators", "PRECEDENCE"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "\\",
"q.operators", "PRECEDENCE"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", ")",
"q.operators", "AND, NOT, OR, PHRASE, PREFIX, ESCAPE, WHITESPACE"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "\\",
"q.operators", "AND, NOT, OR, PHRASE, PREFIX, ESCAPE, WHITESPACE"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", ")",
"q.operators", "PRECEDENCE"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "\\",
"q.operators", "PRECEDENCE"), "/response/numFound==1");
}
@Test
public void testOnlyEscapeOperatorEnabledDisabled() throws Exception {
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "\\",
"q.operators", "AND, NOT, OR, PHRASE, PREFIX, PRECEDENCE, WHITESPACE"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "\n",
"q.operators", "AND, NOT, OR, PHRASE, PREFIX, PRECEDENCE, WHITESPACE"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "\\",
"q.operators", "ESCAPE"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "\n",
"q.operators", "ESCAPE"), "/response/numFound==1");
}
@Test
public void testOnlyWhitespaceOperatorEnabledDisabled() throws Exception {
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "\n",
"q.operators", "AND, NOT, OR, PHRASE, PREFIX, PRECEDENCE, ESCAPE"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "\\",
"q.operators", "AND, NOT, OR, PHRASE, PREFIX, PRECEDENCE, ESCAPE"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "\n",
"q.operators", "WHITESPACE"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "\\",
"q.operators", "WHITESPACE"), "/response/numFound==1");
}
@Test
public void testArbitraryOperatorsEnabledDisabled() throws Exception {
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "kw0+kw1+kw2| \\ ",
"q.operators", "AND, NOT, OR, PHRASE"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0 text1 text-keyword0", "q", "t1 + t2 \\",
"q.operators", "AND, WHITESPACE"), "/response/numFound==3");
assertJQ(req("defType", "simple", "qf", "text0 text-keyword0", "q", "t0 + (-t1 -t2) |",
"q.operators", "AND, NOT, PRECEDENCE, WHITESPACE"), "/response/numFound==4");
}
@Test
public void testNoOperators() throws Exception {
assertJQ(req("defType", "simple", "qf", "text1 text-keyword0", "q", "kw0 kw1 kw2",
"q.operators", ""), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text1", "q", "t1 t2 t3",
"q.operators", ""), "/response/numFound==2");
}
@Test
public void testDefaultOperator() throws Exception {
assertJQ(req("defType", "simple", "qf", "text1 text-keyword0", "q", "t2 t3",
"q.op", "AND"), "/response/numFound==0");
assertJQ(req("defType", "simple", "qf", "text0 text-keyword0", "q", "t0 t2",
"q.op", "AND"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text1", "q", "t2 t3"), "/response/numFound==2");
}
/** Test that multiterm analysis chain is used for prefix. */
public void testPrefixChain() throws Exception {
assertJQ(req("defType", "simple", "qf", "text0", "q", "FOOBAR*"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0", "q", "Fóóbar*"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0", "q", "FOO*"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0", "q", "BAR*"), "/response/numFound==0");
}
/** Test that multiterm analysis chain is used for fuzzy. */
public void testFuzzyChain() throws Exception {
assertJQ(req("defType", "simple", "qf", "text0", "q", "FOOBAT~1"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0", "q", "Fóóba~1"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0", "q", "FOOB~2"), "/response/numFound==1");
assertJQ(req("defType", "simple", "qf", "text0", "q", "BAR~1"), "/response/numFound==0");
}
public void testQueryAnalyzerIsUsed() throws Exception {
// this should only match one doc, which was lower cased before being added
assertJQ(req("defType", "simple", "qf", "text-query0", "q", "HELLO"),
"/response/numFound==1");
}
}