Index: lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java =================================================================== --- lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java (revision 1455730) +++ lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java (working copy) @@ -446,9 +446,11 @@ // inherit javadoc @Override public void extractTerms(Set terms) { - for (BooleanClause clause : clauses) { - clause.getQuery().extractTerms(terms); - } + for (BooleanClause clause : clauses) { + if (clause.getOccur() != Occur.MUST_NOT) { + clause.getQuery().extractTerms(terms); + } + } } @Override @SuppressWarnings("unchecked") Index: lucene/highlighter/src/test/org/apache/lucene/search/postingshighlight/TestPostingsHighlighter.java =================================================================== --- lucene/highlighter/src/test/org/apache/lucene/search/postingshighlight/TestPostingsHighlighter.java (revision 1455730) +++ lucene/highlighter/src/test/org/apache/lucene/search/postingshighlight/TestPostingsHighlighter.java (working copy) @@ -406,4 +406,32 @@ ir.close(); dir.close(); } + + public void testBooleanMustNot() throws Exception { + Directory dir = newDirectory(); + Analyzer analyzer = new MockAnalyzer(random(), MockTokenizer.SIMPLE, true); + RandomIndexWriter iw = new RandomIndexWriter(random(), dir, analyzer); + FieldType positionsType = new FieldType(TextField.TYPE_STORED); + positionsType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS); + Field body = new Field("body", "This sentence has both terms. This sentence has only terms.", positionsType); + Document document = new Document(); + document.add(body); + iw.addDocument(document); + IndexReader ir = iw.getReader(); + iw.close(); + IndexSearcher searcher = newSearcher(ir); + BooleanQuery query = new BooleanQuery(); + query.add(new TermQuery(new Term("body", "terms")), BooleanClause.Occur.SHOULD); + BooleanQuery query2 = new BooleanQuery(); + query.add(query2, BooleanClause.Occur.SHOULD); + query2.add(new TermQuery(new Term("body", "both")), BooleanClause.Occur.MUST_NOT); + TopDocs topDocs = searcher.search(query, 10); + assertEquals(1, topDocs.totalHits); + PostingsHighlighter highlighter = new PostingsHighlighter(Integer.MAX_VALUE-1); + String snippets[] = highlighter.highlight("body", query, searcher, topDocs, 2); + assertEquals(1, snippets.length); + assertFalse(snippets[0].contains("both")); + ir.close(); + dir.close(); + } } Index: lucene/CHANGES.txt =================================================================== --- lucene/CHANGES.txt (revision 1455730) +++ lucene/CHANGES.txt (working copy) @@ -74,6 +74,9 @@ * LUCENE-4826: PostingsHighlighter was not returning the top N best scoring passages. (Robert Muir, Mike McCandless) +* LUCENE-4828: BooleanQuery no longer extracts terms from its MUST_NOT + clauses. (Mike McCandless) + ======================= Lucene 4.2.0 ======================= Changes in backwards compatibility policy