📄 testqueryparser.java
字号:
/* Tests to see that wild card terms are (or are not) properly * lower-cased with propery parser configuration */// First prefix queries: // by default, convert to lowercase: assertWildcardQueryEquals("Term*", true, "term*"); // explicitly set lowercase: assertWildcardQueryEquals("term*", true, "term*"); assertWildcardQueryEquals("Term*", true, "term*"); assertWildcardQueryEquals("TERM*", true, "term*"); // explicitly disable lowercase conversion: assertWildcardQueryEquals("term*", false, "term*"); assertWildcardQueryEquals("Term*", false, "Term*"); assertWildcardQueryEquals("TERM*", false, "TERM*");// Then 'full' wildcard queries: // by default, convert to lowercase: assertWildcardQueryEquals("Te?m", "te?m"); // explicitly set lowercase: assertWildcardQueryEquals("te?m", true, "te?m"); assertWildcardQueryEquals("Te?m", true, "te?m"); assertWildcardQueryEquals("TE?M", true, "te?m"); assertWildcardQueryEquals("Te?m*gerM", true, "te?m*germ"); // explicitly disable lowercase conversion: assertWildcardQueryEquals("te?m", false, "te?m"); assertWildcardQueryEquals("Te?m", false, "Te?m"); assertWildcardQueryEquals("TE?M", false, "TE?M"); assertWildcardQueryEquals("Te?m*gerM", false, "Te?m*gerM");// Fuzzy queries: assertWildcardQueryEquals("Term~", "term~0.5"); assertWildcardQueryEquals("Term~", true, "term~0.5"); assertWildcardQueryEquals("Term~", false, "Term~0.5");// Range queries: assertWildcardQueryEquals("[A TO C]", "[a TO c]"); assertWildcardQueryEquals("[A TO C]", true, "[a TO c]"); assertWildcardQueryEquals("[A TO C]", false, "[A TO C]"); // Test suffix queries: first disallow try { assertWildcardQueryEquals("*Term", true, "*term"); fail(); } catch(ParseException pe) { // expected exception } try { assertWildcardQueryEquals("?Term", true, "?term"); fail(); } catch(ParseException pe) { // expected exception } // Test suffix queries: then allow assertWildcardQueryEquals("*Term", true, "*term", true); assertWildcardQueryEquals("?Term", true, "?term", true); } public void testLeadingWildcardType() throws Exception { QueryParser qp = getParser(null); qp.setAllowLeadingWildcard(true); assertEquals(WildcardQuery.class, qp.parse("t*erm*").getClass()); assertEquals(WildcardQuery.class, qp.parse("?term*").getClass()); assertEquals(WildcardQuery.class, qp.parse("*term*").getClass()); } public void testQPA() throws Exception { assertQueryEquals("term term^3.0 term", qpAnalyzer, "term term^3.0 term"); assertQueryEquals("term stop^3.0 term", qpAnalyzer, "term term"); assertQueryEquals("term term term", qpAnalyzer, "term term term"); assertQueryEquals("term +stop term", qpAnalyzer, "term term"); assertQueryEquals("term -stop term", qpAnalyzer, "term term"); assertQueryEquals("drop AND (stop) AND roll", qpAnalyzer, "+drop +roll"); assertQueryEquals("term +(stop) term", qpAnalyzer, "term term"); assertQueryEquals("term -(stop) term", qpAnalyzer, "term term"); assertQueryEquals("drop AND stop AND roll", qpAnalyzer, "+drop +roll"); assertQueryEquals("term phrase term", qpAnalyzer, "term \"phrase1 phrase2\" term"); assertQueryEquals("term AND NOT phrase term", qpAnalyzer, "+term -\"phrase1 phrase2\" term"); assertQueryEquals("stop^3", qpAnalyzer, ""); assertQueryEquals("stop", qpAnalyzer, ""); assertQueryEquals("(stop)^3", qpAnalyzer, ""); assertQueryEquals("((stop))^3", qpAnalyzer, ""); assertQueryEquals("(stop^3)", qpAnalyzer, ""); assertQueryEquals("((stop)^3)", qpAnalyzer, ""); assertQueryEquals("(stop)", qpAnalyzer, ""); assertQueryEquals("((stop))", qpAnalyzer, ""); assertTrue(getQuery("term term term", qpAnalyzer) instanceof BooleanQuery); assertTrue(getQuery("term +stop", qpAnalyzer) instanceof TermQuery); } public void testRange() throws Exception { assertQueryEquals("[ a TO z]", null, "[a TO z]"); assertTrue(getQuery("[ a TO z]", null) instanceof ConstantScoreRangeQuery); QueryParser qp = new QueryParser("field", new SimpleAnalyzer()); qp.setUseOldRangeQuery(true); assertTrue(qp.parse("[ a TO z]") instanceof RangeQuery); assertQueryEquals("[ a TO z ]", null, "[a TO z]"); assertQueryEquals("{ a TO z}", null, "{a TO z}"); assertQueryEquals("{ a TO z }", null, "{a TO z}"); assertQueryEquals("{ a TO z }^2.0", null, "{a TO z}^2.0"); assertQueryEquals("[ a TO z] OR bar", null, "[a TO z] bar"); assertQueryEquals("[ a TO z] AND bar", null, "+[a TO z] +bar"); assertQueryEquals("( bar blar { a TO z}) ", null, "bar blar {a TO z}"); assertQueryEquals("gack ( bar blar { a TO z}) ", null, "gack (bar blar {a TO z})"); } /** for testing legacy DateField support */ private String getLegacyDate(String s) throws Exception { DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT); return DateField.dateToString(df.parse(s)); } /** for testing DateTools support */ private String getDate(String s, DateTools.Resolution resolution) throws Exception { DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT); return getDate(df.parse(s), resolution); } /** for testing DateTools support */ private String getDate(Date d, DateTools.Resolution resolution) throws Exception { if (resolution == null) { return DateField.dateToString(d); } else { return DateTools.dateToString(d, resolution); } } private String getLocalizedDate(int year, int month, int day, boolean extendLastDate) { DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT); Calendar calendar = Calendar.getInstance(); calendar.set(year, month, day); if (extendLastDate) { calendar.set(Calendar.HOUR_OF_DAY, 23); calendar.set(Calendar.MINUTE, 59); calendar.set(Calendar.SECOND, 59); calendar.set(Calendar.MILLISECOND, 999); } return df.format(calendar.getTime()); } /** for testing legacy DateField support */ public void testLegacyDateRange() throws Exception { String startDate = getLocalizedDate(2002, 1, 1, false); String endDate = getLocalizedDate(2002, 1, 4, false); Calendar endDateExpected = Calendar.getInstance(); endDateExpected.set(2002, 1, 4, 23, 59, 59); endDateExpected.set(Calendar.MILLISECOND, 999); assertQueryEquals("[ " + startDate + " TO " + endDate + "]", null, "[" + getLegacyDate(startDate) + " TO " + DateField.dateToString(endDateExpected.getTime()) + "]"); assertQueryEquals("{ " + startDate + " " + endDate + " }", null, "{" + getLegacyDate(startDate) + " TO " + getLegacyDate(endDate) + "}"); } public void testDateRange() throws Exception { String startDate = getLocalizedDate(2002, 1, 1, false); String endDate = getLocalizedDate(2002, 1, 4, false); Calendar endDateExpected = Calendar.getInstance(); endDateExpected.set(2002, 1, 4, 23, 59, 59); endDateExpected.set(Calendar.MILLISECOND, 999); final String defaultField = "default"; final String monthField = "month"; final String hourField = "hour"; QueryParser qp = new QueryParser("field", new SimpleAnalyzer()); // Don't set any date resolution and verify if DateField is used assertDateRangeQueryEquals(qp, defaultField, startDate, endDate, endDateExpected.getTime(), null); // set a field specific date resolution qp.setDateResolution(monthField, DateTools.Resolution.MONTH); // DateField should still be used for defaultField assertDateRangeQueryEquals(qp, defaultField, startDate, endDate, endDateExpected.getTime(), null); // set default date resolution to MILLISECOND qp.setDateResolution(DateTools.Resolution.MILLISECOND); // set second field specific date resolution qp.setDateResolution(hourField, DateTools.Resolution.HOUR); // for this field no field specific date resolution has been set, // so verify if the default resolution is used assertDateRangeQueryEquals(qp, defaultField, startDate, endDate, endDateExpected.getTime(), DateTools.Resolution.MILLISECOND); // verify if field specific date resolutions are used for these two fields assertDateRangeQueryEquals(qp, monthField, startDate, endDate, endDateExpected.getTime(), DateTools.Resolution.MONTH); assertDateRangeQueryEquals(qp, hourField, startDate, endDate, endDateExpected.getTime(), DateTools.Resolution.HOUR); } public void assertDateRangeQueryEquals(QueryParser qp, String field, String startDate, String endDate, Date endDateInclusive, DateTools.Resolution resolution) throws Exception { assertQueryEquals(qp, field, field + ":[" + startDate + " TO " + endDate + "]", "[" + getDate(startDate, resolution) + " TO " + getDate(endDateInclusive, resolution) + "]"); assertQueryEquals(qp, field, field + ":{" + startDate + " TO " + endDate + "}", "{" + getDate(startDate, resolution) + " TO " + getDate(endDate, resolution) + "}"); } public void testEscaped() throws Exception { Analyzer a = new WhitespaceAnalyzer(); /*assertQueryEquals("\\[brackets", a, "\\[brackets"); assertQueryEquals("\\[brackets", null, "brackets"); assertQueryEquals("\\\\", a, "\\\\"); assertQueryEquals("\\+blah", a, "\\+blah"); assertQueryEquals("\\(blah", a, "\\(blah"); assertQueryEquals("\\-blah", a, "\\-blah"); assertQueryEquals("\\!blah", a, "\\!blah"); assertQueryEquals("\\{blah", a, "\\{blah"); assertQueryEquals("\\}blah", a, "\\}blah"); assertQueryEquals("\\:blah", a, "\\:blah"); assertQueryEquals("\\^blah", a, "\\^blah"); assertQueryEquals("\\[blah", a, "\\[blah"); assertQueryEquals("\\]blah", a, "\\]blah"); assertQueryEquals("\\\"blah", a, "\\\"blah"); assertQueryEquals("\\(blah", a, "\\(blah"); assertQueryEquals("\\)blah", a, "\\)blah"); assertQueryEquals("\\~blah", a, "\\~blah"); assertQueryEquals("\\*blah", a, "\\*blah"); assertQueryEquals("\\?blah", a, "\\?blah"); //assertQueryEquals("foo \\&\\& bar", a, "foo \\&\\& bar"); //assertQueryEquals("foo \\|| bar", a, "foo \\|| bar"); //assertQueryEquals("foo \\AND bar", a, "foo \\AND bar");*/ assertQueryEquals("\\a", a, "a"); assertQueryEquals("a\\-b:c", a, "a-b:c"); assertQueryEquals("a\\+b:c", a, "a+b:c"); assertQueryEquals("a\\:b:c", a, "a:b:c"); assertQueryEquals("a\\\\b:c", a, "a\\b:c"); assertQueryEquals("a:b\\-c", a, "a:b-c"); assertQueryEquals("a:b\\+c", a, "a:b+c"); assertQueryEquals("a:b\\:c", a, "a:b:c"); assertQueryEquals("a:b\\\\c", a, "a:b\\c"); assertQueryEquals("a:b\\-c*", a, "a:b-c*"); assertQueryEquals("a:b\\+c*", a, "a:b+c*"); assertQueryEquals("a:b\\:c*", a, "a:b:c*"); assertQueryEquals("a:b\\\\c*", a, "a:b\\c*"); assertQueryEquals("a:b\\-?c", a, "a:b-?c"); assertQueryEquals("a:b\\+?c", a, "a:b+?c"); assertQueryEquals("a:b\\:?c", a, "a:b:?c"); assertQueryEquals("a:b\\\\?c", a, "a:b\\?c"); assertQueryEquals("a:b\\-c~", a, "a:b-c~0.5"); assertQueryEquals("a:b\\+c~", a, "a:b+c~0.5"); assertQueryEquals("a:b\\:c~", a, "a:b:c~0.5"); assertQueryEquals("a:b\\\\c~", a, "a:b\\c~0.5"); assertQueryEquals("[ a\\- TO a\\+ ]", null, "[a- TO a+]"); assertQueryEquals("[ a\\: TO a\\~ ]", null, "[a: TO a~]"); assertQueryEquals("[ a\\\\ TO a\\* ]", null, "[a\\ TO a*]"); assertQueryEquals("[\"c\\:\\\\temp\\\\\\~foo0.txt\" TO \"c\\:\\\\temp\\\\\\~foo9.txt\"]", a, "[c:\\temp\\~foo0.txt TO c:\\temp\\~foo9.txt]"); assertQueryEquals("a\\\\\\+b", a, "a\\+b"); assertQueryEquals("a \\\"b c\\\" d", a, "a \"b c\" d"); assertQueryEquals("\"a \\\"b c\\\" d\"", a, "\"a \"b c\" d\""); assertQueryEquals("\"a \\+b c d\"", a, "\"a +b c d\""); assertQueryEquals("c\\:\\\\temp\\\\\\~foo.txt", a, "c:\\temp\\~foo.txt"); assertParseException("XY\\"); // there must be a character after the escape char // test unicode escaping assertQueryEquals("a\\u0062c", a, "abc"); assertQueryEquals("XY\\u005a", a, "XYZ"); assertQueryEquals("XY\\u005A", a, "XYZ"); assertQueryEquals("\"a \\\\\\u0028\\u0062\\\" c\"", a, "\"a \\(b\" c\""); 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");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -