Index: contrib/highlighter/src/test/org/apache/lucene/search/highlight/HighlighterTest.java =================================================================== --- contrib/highlighter/src/test/org/apache/lucene/search/highlight/HighlighterTest.java (revision 1067886) +++ contrib/highlighter/src/test/org/apache/lucene/search/highlight/HighlighterTest.java (working copy) @@ -1492,6 +1492,28 @@ }; } + protected TokenStream getBigramTokenStream(final String text) { + return new TokenStream() { + int offset = 0; + private TermAttribute termAtt = (TermAttribute) addAttribute(TermAttribute.class); + private PositionIncrementAttribute posIncrAtt = + (PositionIncrementAttribute) addAttribute(PositionIncrementAttribute.class); + private OffsetAttribute offsetAtt = (OffsetAttribute) addAttribute(OffsetAttribute.class); + + public boolean incrementToken() throws IOException { + if (offset < text.length() - 1) { + clearAttributes(); + termAtt.setTermBuffer(text, offset, 2); + posIncrAtt.setPositionIncrement(1); + offsetAtt.setOffset(offset, offset + 2); + offset++; + return true; + } + return false; + } + }; + } + public void testOverlapAnalyzer2() throws Exception { TestHighlightRunner helper = new TestHighlightRunner() { @@ -1568,7 +1590,33 @@ helper.start(); } - + + public void testOverlapAnalyzerWithTokenGroupBoundary() throws Exception { + TestHighlightRunner helper = new TestHighlightRunner() { + + public void run() throws Exception { + String prefix = "0123456789" + + "0123456789" + + "0123456789" + + "0123456789" + + "0123456789"; + String s = prefix + "abcdEND"; + String expected = prefix + "abcdEND"; + + Query query; + Highlighter highlighter; + String result; + + query = new QueryParser("text", new WhitespaceAnalyzer()).parse("ab bc cd"); + highlighter = getHighlighter(query, "text", getBigramTokenStream(s), HighlighterTest.this); + result = highlighter.getBestFragments(getBigramTokenStream(s), s, 3, "..."); + assertEquals(expected, result); + } + }; + + helper.start(); + } + private Directory dir = new RAMDirectory(); private Analyzer a = new WhitespaceAnalyzer(); Index: contrib/highlighter/src/java/org/apache/lucene/search/highlight/Highlighter.java =================================================================== --- contrib/highlighter/src/java/org/apache/lucene/search/highlight/Highlighter.java (revision 1067886) +++ contrib/highlighter/src/java/org/apache/lucene/search/highlight/Highlighter.java (working copy) @@ -280,6 +280,10 @@ docFrags.add(currentFrag); } } + else if (tokenGroup.numTokens > 0 && tokenGroup.getTotalScore() == 0 + && tokenGroup.endOffset < offsetAtt.endOffset()) { + tokenGroup.clear(); + } tokenGroup.addToken(fragmentScorer.getTokenScore());