Index: contrib/highlighter/build.xml =================================================================== --- contrib/highlighter/build.xml (revision 830192) +++ contrib/highlighter/build.xml (working copy) @@ -27,18 +27,26 @@ + + + + - + Highlighter building dependency ${memory.jar} - + + + Highlighter building dependency ${regex.jar} + + Index: contrib/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java =================================================================== --- contrib/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java (revision 830192) +++ contrib/highlighter/src/java/org/apache/lucene/search/highlight/WeightedSpanTermExtractor.java (working copy) @@ -32,6 +32,7 @@ import org.apache.lucene.index.Term; import org.apache.lucene.index.memory.MemoryIndex; import org.apache.lucene.search.*; +import org.apache.lucene.search.regex.SpanRegexQuery; import org.apache.lucene.search.spans.SpanNearQuery; import org.apache.lucene.search.spans.SpanOrQuery; import org.apache.lucene.search.spans.SpanQuery; @@ -130,6 +131,12 @@ extractWeightedSpanTerms(terms, sp); } else if (query instanceof TermQuery) { extractWeightedTerms(terms, query); + } else if(query instanceof SpanRegexQuery) { + if(expandMultiTermQuery) { + String field = ((SpanRegexQuery)query).getTerm().field(); + IndexReader ir = getReaderForField(field); + extract(query.rewrite(ir), terms); + } } else if (query instanceof SpanQuery) { extractWeightedSpanTerms(terms, (SpanQuery) query); } else if (query instanceof FilteredQuery) { Index: contrib/highlighter/src/test/org/apache/lucene/search/highlight/HighlighterTest.java =================================================================== --- contrib/highlighter/src/test/org/apache/lucene/search/highlight/HighlighterTest.java (revision 830192) +++ contrib/highlighter/src/test/org/apache/lucene/search/highlight/HighlighterTest.java (working copy) @@ -49,6 +49,7 @@ import org.apache.lucene.document.NumericField; import org.apache.lucene.document.Field.Index; import org.apache.lucene.document.Field.Store; +import org.apache.lucene.index.CorruptIndexException; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.Term; @@ -70,6 +71,7 @@ import org.apache.lucene.search.WildcardQuery; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.highlight.SynonymTokenizer.TestHighlightRunner; +import org.apache.lucene.search.regex.SpanRegexQuery; import org.apache.lucene.search.spans.SpanNearQuery; import org.apache.lucene.search.spans.SpanNotQuery; import org.apache.lucene.search.spans.SpanQuery; @@ -306,6 +308,30 @@ } + public void testSpanRegexQuery() throws Exception { + query = new SpanRegexQuery(new Term(FIELD_NAME, "ken.*")); + searcher = new IndexSearcher(ramDir, true); + hits = searcher.search(query, 100); + int maxNumFragmentsRequired = 2; + + QueryScorer scorer = new QueryScorer(query, FIELD_NAME); + Highlighter highlighter = new Highlighter(this, scorer); + + for (int i = 0; i < hits.totalHits; i++) { + String text = searcher.doc(hits.scoreDocs[i].doc).get(FIELD_NAME); + TokenStream tokenStream = analyzer.tokenStream(FIELD_NAME, new StringReader(text)); + + highlighter.setTextFragmenter(new SimpleFragmenter(40)); + + String result = highlighter.getBestFragments(tokenStream, text, maxNumFragmentsRequired, + "..."); + System.out.println("\t" + result); + } + + assertTrue("Failed to find correct number of highlights " + numHighlights + " found", + numHighlights == 5); + } + public void testNumericRangeQuery() throws Exception { // doesn't currently highlight, but make sure it doesn't cause exception either query = NumericRangeQuery.newIntRange(NUMERIC_FIELD_NAME, 2, 6, true, true);