diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/search/highlight/HighlightPhase.java b/modules/elasticsearch/src/main/java/org/elasticsearch/search/highlight/HighlightPhase.java index 8908147f1d0..0db8088edb3 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/search/highlight/HighlightPhase.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/search/highlight/HighlightPhase.java @@ -57,9 +57,10 @@ import static org.elasticsearch.common.collect.Maps.*; */ public class HighlightPhase implements SearchHitPhase { - private Encoder encoder; - private FragListBuilder fraglistbuilder; - private FragmentsBuilder fragmentbuiler; + public static class Encoders { + public static Encoder DEFAULT = new DefaultEncoder(); + public static Encoder HTML = new SimpleHTMLEncoder(); + } @Override public Map parseElements() { return ImmutableMap.of("highlight", new HighlighterParseElement()); @@ -75,10 +76,12 @@ public class HighlightPhase implements SearchHitPhase { Map highlightFields = newHashMap(); for (SearchContextHighlight.Field field : context.highlight().fields()) { - if (field.encoder().equals("html")) - encoder = new SimpleHTMLEncoder(); - else - encoder = new DefaultEncoder(); + Encoder encoder; + if (field.encoder().equals("html")) { + encoder = Encoders.HTML; + } else { + encoder = Encoders.DEFAULT; + } FieldMapper mapper = documentMapper.mappers().smartNameFieldMapper(field.field()); if (mapper == null) { MapperService.SmartNameFieldMappers fullMapper = context.mapperService().smartName(field.field()); @@ -118,7 +121,6 @@ public class HighlightPhase implements SearchHitPhase { Formatter formatter = new SimpleHTMLFormatter(field.preTags()[0], field.postTags()[0]); - Highlighter highlighter = new Highlighter(formatter, encoder, queryScorer); highlighter.setTextFragmenter(fragmenter); @@ -188,7 +190,37 @@ public class HighlightPhase implements SearchHitPhase { highlightFields.put(highlightField.name(), highlightField); } } else { - FastVectorHighlighter highlighter = buildHighlighter(context, mapper, field); + FragListBuilder fragListBuilder; + FragmentsBuilder fragmentsBuilder; + if (field.numberOfFragments() == 0) { + fragListBuilder = new SingleFragListBuilder(); + + if (mapper.stored()) { + fragmentsBuilder = new SimpleFragmentsBuilder(field.preTags(), field.postTags()); + } else { + fragmentsBuilder = new SourceSimpleFragmentsBuilder(mapper, context, field.preTags(), field.postTags()); + } + } else { + if (field.fragmentOffset() == -1) + fragListBuilder = new SimpleFragListBuilder(); + else + fragListBuilder = new MarginFragListBuilder(field.fragmentOffset()); + + if (field.scoreOrdered()) { + if (mapper.stored()) { + fragmentsBuilder = new ScoreOrderFragmentsBuilder(field.preTags(), field.postTags()); + } else { + fragmentsBuilder = new SourceScoreOrderFragmentsBuilder(mapper, context, field.preTags(), field.postTags()); + } + } else { + if (mapper.stored()) { + fragmentsBuilder = new SimpleFragmentsBuilder(field.preTags(), field.postTags()); + } else { + fragmentsBuilder = new SourceSimpleFragmentsBuilder(mapper, context, field.preTags(), field.postTags()); + } + } + } + FastVectorHighlighter highlighter = new FastVectorHighlighter(true, false, fragListBuilder, fragmentsBuilder); FieldQuery fieldQuery = buildFieldQuery(highlighter, context.query(), hitContext.reader(), field); String[] fragments; @@ -196,7 +228,7 @@ public class HighlightPhase implements SearchHitPhase { // a HACK to make highlighter do highlighting, even though its using the single frag list builder int numberOfFragments = field.numberOfFragments() == 0 ? 1 : field.numberOfFragments(); fragments = highlighter.getBestFragments(fieldQuery, hitContext.reader(), hitContext.docId(), mapper.names().indexName(), field.fragmentCharSize(), numberOfFragments, - this.fraglistbuilder, this.fragmentbuiler, field.preTags(), field.postTags(), encoder); + fragListBuilder, fragmentsBuilder, field.preTags(), field.postTags(), encoder); } catch (IOException e) { throw new FetchPhaseExecutionException(context, "Failed to highlight field [" + field.field() + "]", e); } @@ -219,41 +251,4 @@ public class HighlightPhase implements SearchHitPhase { CustomFieldQuery.highlightFilters.set(field.highlightFilter()); return new CustomFieldQuery(query, highlighter); } - - private FastVectorHighlighter buildHighlighter(SearchContext searchContext, FieldMapper fieldMapper, SearchContextHighlight.Field field) { - FragListBuilder fragListBuilder; - FragmentsBuilder fragmentsBuilder; - if (field.numberOfFragments() == 0) { - fragListBuilder = new SingleFragListBuilder(); - - if (fieldMapper.stored()) { - fragmentsBuilder = new SimpleFragmentsBuilder(field.preTags(), field.postTags()); - } else { - fragmentsBuilder = new SourceSimpleFragmentsBuilder(fieldMapper, searchContext, field.preTags(), field.postTags()); - } - } else { - if (field.fragmentOffset() == -1) - fragListBuilder = new SimpleFragListBuilder(); - else - fragListBuilder = new MarginFragListBuilder(field.fragmentOffset()); - - if (field.scoreOrdered()) { - if (fieldMapper.stored()) { - fragmentsBuilder = new ScoreOrderFragmentsBuilder(field.preTags(), field.postTags()); - } else { - fragmentsBuilder = new SourceScoreOrderFragmentsBuilder(fieldMapper, searchContext, field.preTags(), field.postTags()); - } - } else { - if (fieldMapper.stored()) { - fragmentsBuilder = new SimpleFragmentsBuilder(field.preTags(), field.postTags()); - } else { - fragmentsBuilder = new SourceSimpleFragmentsBuilder(fieldMapper, searchContext, field.preTags(), field.postTags()); - } - } - } - this.fraglistbuilder = fragListBuilder; - this.fragmentbuiler = fragmentsBuilder; - return new FastVectorHighlighter(true, false, fragListBuilder, fragmentsBuilder); - } - }