Index: lucene/queries/src/java/org/apache/lucene/queries/CommonTermsQuery.java =================================================================== --- lucene/queries/src/java/org/apache/lucene/queries/CommonTermsQuery.java (revision 1530249) +++ lucene/queries/src/java/org/apache/lucene/queries/CommonTermsQuery.java (working copy) @@ -214,18 +214,13 @@ * if lowFreq is empty we rewrite the high freq terms in a conjunction to * prevent slow queries. */ - if (highFreqOccur == Occur.MUST) { - highFreq.setBoost(getBoost()); - return highFreq; - } else { - BooleanQuery highFreqConjunction = new BooleanQuery(); + if (highFreq.getMinimumNumberShouldMatch() == 0 && highFreqOccur != Occur.MUST) { for (BooleanClause booleanClause : highFreq) { - highFreqConjunction.add(booleanClause.getQuery(), Occur.MUST); + booleanClause.setOccur(Occur.MUST); } - highFreqConjunction.setBoost(getBoost()); - return highFreqConjunction; - } + highFreq.setBoost(getBoost()); + return highFreq; } else if (highFreq.clauses().isEmpty()) { // only do low freq terms - we don't have high freq terms lowFreq.setBoost(getBoost()); Index: lucene/queries/src/test/org/apache/lucene/queries/CommonTermsQueryTest.java =================================================================== --- lucene/queries/src/test/org/apache/lucene/queries/CommonTermsQueryTest.java (revision 1530249) +++ lucene/queries/src/test/org/apache/lucene/queries/CommonTermsQueryTest.java (working copy) @@ -283,6 +283,37 @@ r.document(search.scoreDocs[1].doc).get("id"), r.document(search.scoreDocs[2].doc).get("id")))); } + + { + // only high freq terms around - check that min should match is applied + CommonTermsQuery query = new CommonTermsQuery(Occur.SHOULD, Occur.SHOULD, + random().nextBoolean() ? 2.0f : 0.5f); + query.add(new Term("field", "is")); + query.add(new Term("field", "this")); + query.add(new Term("field", "the")); + query.setLowFreqMinimumNumberShouldMatch(1.0f); + query.setHighFreqMinimumNumberShouldMatch(2.0f); + TopDocs search = s.search(query, 10); + assertEquals(search.totalHits, 4); + } + + { + // only high freq terms around - check that min should match is applied + CommonTermsQuery query = new CommonTermsQuery(Occur.MUST, Occur.SHOULD, + random().nextBoolean() ? 2.0f : 0.5f); + query.add(new Term("field", "is")); + query.add(new Term("field", "this")); + query.add(new Term("field", "the")); + query.setLowFreqMinimumNumberShouldMatch(1.0f); + query.setHighFreqMinimumNumberShouldMatch(2.0f); + TopDocs search = s.search(query, 10); + assertEquals(search.totalHits, 2); + assertEquals( + new HashSet<>(Arrays.asList("0", "2")), + new HashSet<>(Arrays.asList( + r.document(search.scoreDocs[0].doc).get("id"), + r.document(search.scoreDocs[1].doc).get("id")))); + } r.close(); w.close(); dir.close();