/** Returns the {@link PassageFormatter} to use for * formatting passages into highlighted snippets. This * returns a new {@code PassageFormatter} by default; * subclasses can override to customize. */ protected PassageFormatter getFormatter(String field) { if (defaultFormatter == null) { defaultFormatter = new DefaultPassageFormatter(); } return defaultFormatter; }
@Override public String format(Passage passages[], String content) { StringBuilder sb = new StringBuilder(); int pos = 0; for (Passage passage : passages) { // don't add ellipsis if it's the first one, or if it's connected. if (passage.startOffset > pos && pos > 0) { sb.append(ellipsis); } pos = passage.startOffset; for (int i = 0; i < passage.numMatches; i++) { int start = passage.matchStarts[i]; int end = passage.matchEnds[i]; // it's possible to have overlapping terms if (start > pos) { append(sb, content, pos, start); } if (end > pos) { sb.append(preTag); append(sb, content, Math.max(pos, start), end); sb.append(postTag); pos = end; } } // it's possible a "term" from the analyzer could span a sentence boundary. append(sb, content, pos, Math.max(pos, passage.endOffset)); pos = passage.endOffset; } return sb.toString(); }