Index: contrib/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java
===================================================================
--- contrib/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java	(revision 794891)
+++ contrib/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java	(working copy)
@@ -101,13 +101,12 @@
   private void extract(Query query, Map terms) throws IOException {
     if (query instanceof BooleanQuery) {
       BooleanClause[] queryClauses = ((BooleanQuery) query).getClauses();
-      Map booleanTerms = new PositionCheckingMap();
+  
       for (int i = 0; i < queryClauses.length; i++) {
         if (!queryClauses[i].isProhibited()) {
-          extract(queryClauses[i].getQuery(), booleanTerms);
+          extract(queryClauses[i].getQuery(), terms);
         }
       }
-      terms.putAll(booleanTerms);
     } else if (query instanceof PhraseQuery) {
       Term[] phraseQueryTerms = ((PhraseQuery) query).getTerms();
       SpanQuery[] clauses = new SpanQuery[phraseQueryTerms.length];
@@ -132,11 +131,9 @@
     } else if (query instanceof FilteredQuery) {
       extract(((FilteredQuery) query).getQuery(), terms);
     } else if (query instanceof DisjunctionMaxQuery) {
-      Map disjunctTerms = new PositionCheckingMap();
       for (Iterator iterator = ((DisjunctionMaxQuery) query).iterator(); iterator.hasNext();) {
-        extract((Query) iterator.next(), disjunctTerms);
+        extract((Query) iterator.next(), terms);
       }
-      terms.putAll(disjunctTerms);
     } else if (query instanceof MultiTermQuery && (highlightCnstScrRngQuery || expandMultiTermQuery)) {
       MultiTermQuery mtq = ((MultiTermQuery)query);
       if(mtq.getConstantScoreRewrite()) {
Index: contrib/highlighter/src/test/org/apache/lucene/search/highlight/HighlighterTest.java
===================================================================
--- contrib/highlighter/src/test/org/apache/lucene/search/highlight/HighlighterTest.java	(revision 794891)
+++ contrib/highlighter/src/test/org/apache/lucene/search/highlight/HighlighterTest.java	(working copy)
@@ -177,6 +177,30 @@
     // throw any exceptions
   }
 
+  public void testRepeatingTermsInMultBooleans() throws Exception {
+    String content = "x y z a b c d e f g b c g";
+    String ph1 = "\"a b c d\"";
+    String ph2 = "\"b c g\"";
+    String f1 = "f1";
+    String f2 = "f2";
+    String f1c = f1 + ":";
+    String f2c = f2 + ":";
+    String q = "(" + f1c + ph1 + " OR " + f2c + ph1 + ") AND (" + f1c + ph2
+        + " OR " + f2c + ph2 + ")";
+    Analyzer analyzer = new WhitespaceAnalyzer();
+    QueryParser qp = new QueryParser(f1, analyzer);
+    Query query = qp.parse(q);
+    CachingTokenFilter stream = new CachingTokenFilter(analyzer.tokenStream(f1,
+        new StringReader(content)));
+    Scorer scorer = new SpanScorer(query, f1, stream, false);
+    Highlighter h = new Highlighter(this, scorer);
+
+    h.getBestFragment(analyzer, f1, content);
+
+    assertTrue("Failed to find correct number of highlights " + numHighlights + " found",
+        numHighlights == 7);
+  }
+
   public void testSimpleSpanPhraseHighlighting() throws Exception {
     doSearching("\"very long and contains\"");
 

