// TODO: Move to QueryParserTestBase once standard flexible parser gets this capability public void testMultiWordSynonyms() throws Exception { QueryParser dumb = new QueryParser("field", new Analyzer1()); dumb.setSplitOnWhitespace(false); // A multi-word synonym source will form a synonym query for the same-starting-position tokens BooleanQuery.Builder multiWordExpandedBqBuilder = new BooleanQuery.Builder(); Query multiWordSynonymQuery = new SynonymQuery(new Term("field", "guinea"), new Term("field", "cavy")); multiWordExpandedBqBuilder.add(multiWordSynonymQuery, BooleanClause.Occur.SHOULD); multiWordExpandedBqBuilder.add( new TermQuery(new Term("field", "pig")), BooleanClause.Occur.SHOULD); Query multiWordExpandedBq = multiWordExpandedBqBuilder.build(); assertEquals(multiWordExpandedBq, dumb.parse("guinea pig")); // With the phrase operator, a multi-word synonym source will form a multiphrase query. // When the number of expanded term(s) is different from that of the original term(s), this is // not good. MultiPhraseQuery.Builder multiWordExpandedMpqBuilder = new MultiPhraseQuery.Builder(); multiWordExpandedMpqBuilder.add( new Term[] {new Term("field", "guinea"), new Term("field", "cavy")}); multiWordExpandedMpqBuilder.add(new Term("field", "pig")); Query multiWordExpandedMPQ = multiWordExpandedMpqBuilder.build(); assertEquals(multiWordExpandedMPQ, dumb.parse("\"guinea pig\"")); // custom behavior, the synonyms are expanded, unless you use quote operator QueryParser smart = new SmartQueryParser(); smart.setSplitOnWhitespace(false); assertEquals(multiWordExpandedBq, smart.parse("guinea pig")); PhraseQuery.Builder multiWordUnexpandedPqBuilder = new PhraseQuery.Builder(); multiWordUnexpandedPqBuilder.add(new Term("field", "guinea")); multiWordUnexpandedPqBuilder.add(new Term("field", "pig")); Query multiWordUnexpandedPq = multiWordUnexpandedPqBuilder.build(); assertEquals(multiWordUnexpandedPq, smart.parse("\"guinea pig\"")); }
public QueryParser getParser(Analyzer a) throws Exception { if (a == null) a = new MockAnalyzer(random(), MockTokenizer.SIMPLE, true); QueryParser qp = new QueryParser(getDefaultField(), a); qp.setDefaultOperator(QueryParserBase.OR_OPERATOR); qp.setSplitOnWhitespace(splitOnWhitespace); return qp; }