Index: lucene/contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQPHelper.java =================================================================== --- lucene/contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQPHelper.java (revision 1195039) +++ lucene/contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQPHelper.java (working copy) @@ -342,8 +342,16 @@ BooleanQuery expected = new BooleanQuery(); expected.add(new TermQuery(new Term("field", "中")), BooleanClause.Occur.SHOULD); expected.add(new TermQuery(new Term("field", "国")), BooleanClause.Occur.SHOULD); + assertEquals(expected, getQuery("中国", analyzer)); - assertEquals(expected, getQuery("中国", analyzer)); + expected = new BooleanQuery(); + expected.add(new TermQuery(new Term("field", "foo")), BooleanClause.Occur.MUST); + BooleanQuery inner = new BooleanQuery(); + inner.add(new TermQuery(new Term("field", "中")), BooleanClause.Occur.SHOULD); + inner.add(new TermQuery(new Term("field", "国")), BooleanClause.Occur.SHOULD); + expected.add(inner, BooleanClause.Occur.MUST); + assertEquals(expected, getQuery("foo AND 中国", analyzer)); + } public void testCJKBoostedTerm() throws Exception { @@ -590,7 +598,7 @@ assertQueryEquals("drop AND stop AND roll", qpAnalyzer, "+drop +roll"); assertQueryEquals("term phrase term", qpAnalyzer, - "term phrase1 phrase2 term"); + "term (phrase1 phrase2) term"); assertQueryEquals("term AND NOT phrase term", qpAnalyzer, "+term -(phrase1 phrase2) term"); Index: lucene/contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQueryParserWrapper.java =================================================================== --- lucene/contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQueryParserWrapper.java (revision 1195039) +++ lucene/contrib/queryparser/src/test/org/apache/lucene/queryParser/standard/TestQueryParserWrapper.java (working copy) @@ -579,7 +579,7 @@ assertQueryEquals("drop AND stop AND roll", qpAnalyzer, "+drop +roll"); assertQueryEquals("term phrase term", qpAnalyzer, - "term phrase1 phrase2 term"); + "term (phrase1 phrase2) term"); assertQueryEquals("term AND NOT phrase term", qpAnalyzer, "+term -(phrase1 phrase2) term"); Index: lucene/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/AnalyzerQueryNodeProcessor.java =================================================================== --- lucene/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/AnalyzerQueryNodeProcessor.java (revision 1195039) +++ lucene/contrib/queryparser/src/java/org/apache/lucene/queryParser/standard/processors/AnalyzerQueryNodeProcessor.java (working copy) @@ -30,6 +30,7 @@ import org.apache.lucene.analysis.tokenattributes.PositionIncrementAttribute; import org.apache.lucene.queryParser.core.QueryNodeException; import org.apache.lucene.queryParser.core.config.QueryConfigHandler; +import org.apache.lucene.queryParser.core.nodes.BooleanQueryNode; import org.apache.lucene.queryParser.core.nodes.FieldQueryNode; import org.apache.lucene.queryParser.core.nodes.FuzzyQueryNode; import org.apache.lucene.queryParser.core.nodes.GroupQueryNode; @@ -203,12 +204,8 @@ children.add(new FieldQueryNode(field, term, -1, -1)); } - if (positionCount == 1) - return new GroupQueryNode( - new StandardBooleanQueryNode(children, true)); - else - return new StandardBooleanQueryNode(children, false); - + return new GroupQueryNode( + new StandardBooleanQueryNode(children, positionCount == 1)); } else { // phrase query: MultiPhraseQueryNode mpq = new MultiPhraseQueryNode(); Index: lucene/contrib/CHANGES.txt =================================================================== --- lucene/contrib/CHANGES.txt (revision 1195039) +++ lucene/contrib/CHANGES.txt (working copy) @@ -85,6 +85,9 @@ * LUCENE-3508: Decompounders based on CompoundWordTokenFilterBase can now be used with custom attributes. All those attributes are preserved and set on all added decompounded tokens. (Spyros Kapnissis, Uwe Schindler) + + * LUCENE-3542: Group expanded query terms to preserve parent boolean operator + in StandartQueryParser. (Simon Willnauer) API Changes