📄 testqueryparser.java
字号:
assertParseException("XY\\u005G"); // test non-hex character in escaped unicode sequence assertParseException("XY\\u005"); // test incomplete escaped unicode sequence // Tests bug LUCENE-800 assertQueryEquals("(item:\\\\ item:ABCD\\\\)", a, "item:\\ item:ABCD\\"); assertParseException("(item:\\\\ item:ABCD\\\\))"); // unmatched closing paranthesis assertQueryEquals("\\*", a, "*"); assertQueryEquals("\\\\", a, "\\"); // escaped backslash assertParseException("\\"); // a backslash must always be escaped } public void testQueryStringEscaping() throws Exception { Analyzer a = new WhitespaceAnalyzer(); assertEscapedQueryEquals("a-b:c", a, "a\\-b\\:c"); assertEscapedQueryEquals("a+b:c", a, "a\\+b\\:c"); assertEscapedQueryEquals("a:b:c", a, "a\\:b\\:c"); assertEscapedQueryEquals("a\\b:c", a, "a\\\\b\\:c"); assertEscapedQueryEquals("a:b-c", a, "a\\:b\\-c"); assertEscapedQueryEquals("a:b+c", a, "a\\:b\\+c"); assertEscapedQueryEquals("a:b:c", a, "a\\:b\\:c"); assertEscapedQueryEquals("a:b\\c", a, "a\\:b\\\\c"); assertEscapedQueryEquals("a:b-c*", a, "a\\:b\\-c\\*"); assertEscapedQueryEquals("a:b+c*", a, "a\\:b\\+c\\*"); assertEscapedQueryEquals("a:b:c*", a, "a\\:b\\:c\\*"); assertEscapedQueryEquals("a:b\\\\c*", a, "a\\:b\\\\\\\\c\\*"); assertEscapedQueryEquals("a:b-?c", a, "a\\:b\\-\\?c"); assertEscapedQueryEquals("a:b+?c", a, "a\\:b\\+\\?c"); assertEscapedQueryEquals("a:b:?c", a, "a\\:b\\:\\?c"); assertEscapedQueryEquals("a:b?c", a, "a\\:b\\?c"); assertEscapedQueryEquals("a:b-c~", a, "a\\:b\\-c\\~"); assertEscapedQueryEquals("a:b+c~", a, "a\\:b\\+c\\~"); assertEscapedQueryEquals("a:b:c~", a, "a\\:b\\:c\\~"); assertEscapedQueryEquals("a:b\\c~", a, "a\\:b\\\\c\\~"); assertEscapedQueryEquals("[ a - TO a+ ]", null, "\\[ a \\- TO a\\+ \\]"); assertEscapedQueryEquals("[ a : TO a~ ]", null, "\\[ a \\: TO a\\~ \\]"); assertEscapedQueryEquals("[ a\\ TO a* ]", null, "\\[ a\\\\ TO a\\* \\]"); // LUCENE-881 assertEscapedQueryEquals("|| abc ||", a, "\\|\\| abc \\|\\|"); assertEscapedQueryEquals("&& abc &&", a, "\\&\\& abc \\&\\&"); } public void testTabNewlineCarriageReturn() throws Exception { assertQueryEqualsDOA("+weltbank +worlbank", null, "+weltbank +worlbank"); assertQueryEqualsDOA("+weltbank\n+worlbank", null, "+weltbank +worlbank"); assertQueryEqualsDOA("weltbank \n+worlbank", null, "+weltbank +worlbank"); assertQueryEqualsDOA("weltbank \n +worlbank", null, "+weltbank +worlbank"); assertQueryEqualsDOA("+weltbank\r+worlbank", null, "+weltbank +worlbank"); assertQueryEqualsDOA("weltbank \r+worlbank", null, "+weltbank +worlbank"); assertQueryEqualsDOA("weltbank \r +worlbank", null, "+weltbank +worlbank"); assertQueryEqualsDOA("+weltbank\r\n+worlbank", null, "+weltbank +worlbank"); assertQueryEqualsDOA("weltbank \r\n+worlbank", null, "+weltbank +worlbank"); assertQueryEqualsDOA("weltbank \r\n +worlbank", null, "+weltbank +worlbank"); assertQueryEqualsDOA("weltbank \r \n +worlbank", null, "+weltbank +worlbank"); assertQueryEqualsDOA("+weltbank\t+worlbank", null, "+weltbank +worlbank"); assertQueryEqualsDOA("weltbank \t+worlbank", null, "+weltbank +worlbank"); assertQueryEqualsDOA("weltbank \t +worlbank", null, "+weltbank +worlbank"); } public void testSimpleDAO() throws Exception { assertQueryEqualsDOA("term term term", null, "+term +term +term"); assertQueryEqualsDOA("term +term term", null, "+term +term +term"); assertQueryEqualsDOA("term term +term", null, "+term +term +term"); assertQueryEqualsDOA("term +term +term", null, "+term +term +term"); assertQueryEqualsDOA("-term term term", null, "-term +term +term"); } public void testBoost() throws Exception { StandardAnalyzer oneStopAnalyzer = new StandardAnalyzer(new String[]{"on"}); QueryParser qp = new QueryParser("field", oneStopAnalyzer); Query q = qp.parse("on^1.0"); assertNotNull(q); q = qp.parse("\"hello\"^2.0"); assertNotNull(q); assertEquals(q.getBoost(), (float) 2.0, (float) 0.5); q = qp.parse("hello^2.0"); assertNotNull(q); assertEquals(q.getBoost(), (float) 2.0, (float) 0.5); q = qp.parse("\"on\"^1.0"); assertNotNull(q); QueryParser qp2 = new QueryParser("field", new StandardAnalyzer()); q = qp2.parse("the^3"); // "the" is a stop word so the result is an empty query: assertNotNull(q); assertEquals("", q.toString()); assertEquals(1.0f, q.getBoost(), 0.01f); } public void assertParseException(String queryString) throws Exception { try { Query q = getQuery(queryString, null); } catch (ParseException expected) { return; } fail("ParseException expected, not thrown"); } public void testException() throws Exception { assertParseException("\"some phrase"); assertParseException("(foo bar"); assertParseException("foo bar))"); assertParseException("field:term:with:colon some more terms"); assertParseException("(sub query)^5.0^2.0 plus more"); assertParseException("secret AND illegal) AND access:confidential"); } public void testCustomQueryParserWildcard() { try { new QPTestParser("contents", new WhitespaceAnalyzer()).parse("a?t"); fail("Wildcard queries should not be allowed"); } catch (ParseException expected) { // expected exception } } public void testCustomQueryParserFuzzy() throws Exception { try { new QPTestParser("contents", new WhitespaceAnalyzer()).parse("xunit~"); fail("Fuzzy queries should not be allowed"); } catch (ParseException expected) { // expected exception } } public void testBooleanQuery() throws Exception { BooleanQuery.setMaxClauseCount(2); try { QueryParser qp = new QueryParser("field", new WhitespaceAnalyzer()); qp.parse("one two three"); fail("ParseException expected due to too many boolean clauses"); } catch (ParseException expected) { // too many boolean clauses, so ParseException is expected } } /** * This test differs from TestPrecedenceQueryParser */ public void testPrecedence() throws Exception { QueryParser qp = new QueryParser("field", new WhitespaceAnalyzer()); Query query1 = qp.parse("A AND B OR C AND D"); Query query2 = qp.parse("+A +B +C +D"); assertEquals(query1, query2); } public void testLocalDateFormat() throws IOException, ParseException { RAMDirectory ramDir = new RAMDirectory(); IndexWriter iw = new IndexWriter(ramDir, new WhitespaceAnalyzer(), true); addDateDoc("a", 2005, 12, 2, 10, 15, 33, iw); addDateDoc("b", 2005, 12, 4, 22, 15, 00, iw); iw.close(); IndexSearcher is = new IndexSearcher(ramDir); assertHits(1, "[12/1/2005 TO 12/3/2005]", is); assertHits(2, "[12/1/2005 TO 12/4/2005]", is); assertHits(1, "[12/3/2005 TO 12/4/2005]", is); assertHits(1, "{12/1/2005 TO 12/3/2005}", is); assertHits(1, "{12/1/2005 TO 12/4/2005}", is); assertHits(0, "{12/3/2005 TO 12/4/2005}", is); is.close(); } public void testStarParsing() throws Exception { final int[] type = new int[1]; QueryParser qp = new QueryParser("field", new WhitespaceAnalyzer()) { protected Query getWildcardQuery(String field, String termStr) throws ParseException { // override error checking of superclass type[0]=1; return new TermQuery(new Term(field,termStr)); } protected Query getPrefixQuery(String field, String termStr) throws ParseException { // override error checking of superclass type[0]=2; return new TermQuery(new Term(field,termStr)); } protected Query getFieldQuery(String field, String queryText) throws ParseException { type[0]=3; return super.getFieldQuery(field, queryText); } }; TermQuery tq; tq = (TermQuery)qp.parse("foo:zoo*"); assertEquals("zoo",tq.getTerm().text()); assertEquals(2,type[0]); tq = (TermQuery)qp.parse("foo:zoo*^2"); assertEquals("zoo",tq.getTerm().text()); assertEquals(2,type[0]); assertEquals(tq.getBoost(),2,0); tq = (TermQuery)qp.parse("foo:*"); assertEquals("*",tq.getTerm().text()); assertEquals(1,type[0]); // could be a valid prefix query in the future too tq = (TermQuery)qp.parse("foo:*^2"); assertEquals("*",tq.getTerm().text()); assertEquals(1,type[0]); assertEquals(tq.getBoost(),2,0); tq = (TermQuery)qp.parse("*:foo"); assertEquals("*",tq.getTerm().field()); assertEquals("foo",tq.getTerm().text()); assertEquals(3,type[0]); tq = (TermQuery)qp.parse("*:*"); assertEquals("*",tq.getTerm().field()); assertEquals("*",tq.getTerm().text()); assertEquals(1,type[0]); // could be handled as a prefix query in the future tq = (TermQuery)qp.parse("(*:*)"); assertEquals("*",tq.getTerm().field()); assertEquals("*",tq.getTerm().text()); assertEquals(1,type[0]); } public void testMatchAllDocs() throws Exception { QueryParser qp = new QueryParser("field", new WhitespaceAnalyzer()); assertEquals(new MatchAllDocsQuery(), qp.parse("*:*")); assertEquals(new MatchAllDocsQuery(), qp.parse("(*:*)")); BooleanQuery bq = (BooleanQuery)qp.parse("+*:* -*:*"); assertTrue(bq.getClauses()[0].getQuery() instanceof MatchAllDocsQuery); assertTrue(bq.getClauses()[1].getQuery() instanceof MatchAllDocsQuery); } private void assertHits(int expected, String query, IndexSearcher is) throws ParseException, IOException { QueryParser qp = new QueryParser("date", new WhitespaceAnalyzer()); qp.setLocale(Locale.ENGLISH); Query q = qp.parse(query); Hits hits = is.search(q); assertEquals(expected, hits.length()); } private static void addDateDoc(String content, int year, int month, int day, int hour, int minute, int second, IndexWriter iw) throws IOException { Document d = new Document(); d.add(new Field("f", content, Field.Store.YES, Field.Index.TOKENIZED)); Calendar cal = Calendar.getInstance(); cal.set(year, month-1, day, hour, minute, second); d.add(new Field("date", DateField.dateToString(cal.getTime()), Field.Store.YES, Field.Index.UN_TOKENIZED)); iw.addDocument(d); } public void tearDown() { BooleanQuery.setMaxClauseCount(originalMaxClauses); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -