Index: src/test/org/apache/lucene/search/TestBooleanMinShouldMatch.java =================================================================== --- src/test/org/apache/lucene/search/TestBooleanMinShouldMatch.java (revision 611183) +++ src/test/org/apache/lucene/search/TestBooleanMinShouldMatch.java (working copy) @@ -284,7 +284,17 @@ verifyNrHits(q, 0); } + public void testNoOptionalButMin2() throws Exception { + /* one required, no optional */ + BooleanQuery q = new BooleanQuery(); + q.add(new TermQuery(new Term("all", "all" )), BooleanClause.Occur.MUST);//true, false); + + q.setMinimumNumberShouldMatch(1); // 1 of 0 optional + + verifyNrHits(q, 0); + } + public void testRandomQueries() throws Exception { final Random rnd = new Random(0); Index: src/java/org/apache/lucene/search/BooleanQuery.java =================================================================== --- src/java/org/apache/lucene/search/BooleanQuery.java (revision 611183) +++ src/java/org/apache/lucene/search/BooleanQuery.java (working copy) @@ -363,7 +363,7 @@ } public Query rewrite(IndexReader reader) throws IOException { - if (clauses.size() == 1) { // optimize 1-clause queries + if (minNrShouldMatch == 0 && clauses.size() == 1) { // optimize 1-clause queries BooleanClause c = (BooleanClause)clauses.get(0); if (!c.isProhibited()) { // just return clause