| /* |
| * 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"); |
| } |
| } |