List of usage examples for org.apache.lucene.search.highlight NullFragmenter NullFragmenter
NullFragmenter
From source file:de.spartusch.nasfvi.server.NSearcher.java
License:Apache License
/** * Extracts a field's values from a document. This method is aware of * <i>collapsed</i> or <i>merged</i> fields and handles them properly. * @param nquery NQuery used for searching * @param doc Document to extract the field's values from * @param field Name of the field to extract values for * @return Set of extracted values//from w w w . j a va 2 s . co m */ private Set<String> extractValues(final NQuery nquery, final Document doc, final String field) { Set<String> values = new HashSet<String>(); if (NQuery.isFieldToCollapse(field)) { // process merged field String mfield = NQuery.getMergedField(); QueryScorer scorer = new QueryScorer(nquery.getQuery(), mfield); Highlighter highlighter = new Highlighter(scorer); highlighter.setTextFragmenter(new NullFragmenter()); try { Set<String> buffer = new HashSet<String>(); for (Fieldable f : doc.getFieldables(mfield)) { String content = f.stringValue(); String value = normalizeValue(NQuery.extractValue(field, content)); // Test if the field was matched by the query TokenStream ts = TokenSources.getTokenStream(mfield, content, nquery.getAnalyzer()); if (highlighter.getBestFragment(ts, content) != null) { values.add(value); } else { // Buffer the value - in case no field matches buffer.add(value); } } if (values.isEmpty()) { // No field was matched by the query values.addAll(buffer); } } catch (IOException e) { throw new RuntimeException(e); } catch (InvalidTokenOffsetsException e) { throw new RuntimeException(e); } } else { for (String v : doc.getValues(field)) { values.add(normalizeValue(v)); } } return values; }
From source file:es.ua.labidiomas.corpus.searcher.Searcher.java
/** * Prepares the highlighter to highlight the terms that matches with the * search criteria./* w ww.j a v a 2s . co m*/ * * @param searchQuery the query that contains the search criteria. * @return the highlighter configured. */ private void setHighlighter(SearchConfiguration params) { Query query; if (params.getOptions().isTitle()) { query = _prepareQuery(params.getSearchNodes(), "title", params.getOptions().isOrder(), params.getOptions().isDistance()); } else { query = _prepareQuery(params.getSearchNodes(), "text", params.getOptions().isOrder(), params.getOptions().isDistance()); } QueryScorer scorer = new QueryScorer(query); SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<b>", "</b>"); this.textHighlighter = new Highlighter(formatter, scorer); textHighlighter.setTextFragmenter(new NullFragmenter()); }
From source file:net.sourceforge.docfetcher.model.search.HighlightService.java
License:Open Source License
@MutableCopy @NotNull/*from w w w. j a va 2 s . co m*/ private static List<Range> highlight(@NotNull Query query, @NotNull String text) throws CheckedOutOfMemoryError { final List<Range> ranges = new ArrayList<Range>(); /* * A formatter is supposed to return formatted text, but since we're * only interested in the start and end offsets of the search terms, we * return null and store the offsets in a list. */ Formatter nullFormatter = new Formatter() { public String highlightTerm(String originalText, TokenGroup tokenGroup) { for (int i = 0; i < tokenGroup.getNumTokens(); i++) { Token token = tokenGroup.getToken(i); if (tokenGroup.getScore(i) == 0) continue; int start = token.startOffset(); int end = token.endOffset(); ranges.add(new Range(start, end - start)); } return null; } }; String key = Fields.CONTENT.key(); Highlighter highlighter = new Highlighter(nullFormatter, new QueryScorer(query, key)); highlighter.setMaxDocCharsToAnalyze(Integer.MAX_VALUE); highlighter.setTextFragmenter(new NullFragmenter()); try { /* * This has a return value, but we ignore it since we only want the * offsets. Might throw an OutOfMemoryError. */ highlighter.getBestFragment(IndexRegistry.getAnalyzer(), key, text); } catch (OutOfMemoryError e) { throw new CheckedOutOfMemoryError(e); } catch (Exception e) { Util.printErr(e); } return ranges; }
From source file:net.sourceforge.docfetcher.view.PreviewPanel.java
License:Open Source License
/** * Sets the file to be displayed, using <tt>parser</tt> to extract the * text from the file on the disk. This method does nothing if the given * file is null. The <tt>force</tt> parameter specifies whether the * preview should be updated even if neither the file nor the search terms * have changed in the meantime./* w w w. j a v a 2 s. com*/ */ private void setFile(final File file, final Parser parser, final Query query, boolean force) { File lastFile = this.file; Query lastQuery = this.query; this.file = file; this.parser = parser; this.query = query; // Check input if (file == null) return; if (parser == null) // Allowed to be null if file is null, too throw new IllegalArgumentException(); if (!isActive) return; if (file.equals(lastFile) && !force) if (query != null && query.equals(lastQuery)) return; if (file.isDirectory()) throw new IllegalStateException("File expected for preview, got directory instead."); //$NON-NLS-1$ if (!file.exists()) { textViewer.setText(Msg.file_not_found.value()); showViewer(textViewerContainer); return; } // Use the HTML browser if (file.getAbsolutePath().equals(Const.HELP_FILE) || Pref.Bool.PreviewHTML.getValue()) { final BrowserPanel browser = browserProvider.getBrowser(previewPanel, browserToolBar, parser); if (browser != null) { browser.addProgressListener(new ProgressAdapter() { public void completed(ProgressEvent event) { showViewer(browser); upBt.setEnabled(false); downBt.setEnabled(false); occurrenceCounter.setText("0"); //$NON-NLS-1$ } }); browser.setFile(file); return; } // Browser creation failed, go on to next code block } // Use text renderers showViewer(textViewerContainer); // Use monospace font for text files if (parser instanceof TextParser) { org.eclipse.swt.graphics.Font monoFont = Font.PREVIEW_MONO.getFont(); if (!textViewer.getFont().equals(monoFont)) textViewer.setFont(monoFont); } else { org.eclipse.swt.graphics.Font previewFont = Font.PREVIEW.getFont(); if (!textViewer.getFont().equals(previewFont)) textViewer.setFont(previewFont); } textViewer.setText(Msg.loading.value()); // display loading message new Thread() { // run in a thread because parsing the file takes some time public void run() { // Extract the raw text from the file String text; boolean fileParsed = true; try { text = parser.renderText(file); } catch (ParseException e) { text = Msg.cant_read_file.format(e.getMessage()); fileParsed = false; } catch (OutOfMemoryError e) { /* * We can get here if the user sets a high java heap space * value during indexing and then sets a lower value for * search only usage. */ text = Msg.out_of_jvm_memory.value(); fileParsed = false; } if (PreviewPanel.this.file != file) return; // Another preview request had been started while we were parsing /* * Create the message that will be displayed if the character limit * is reached. It is appended to the file contents later; if it * was appended here, some words in it might get highlighted. */ int maxLength = Pref.Int.PreviewLimit.getValue(); final String msg = "...\n\n\n[" //$NON-NLS-1$ + Msg.preview_limit_hint.format(new Object[] { maxLength, Pref.Int.PreviewLimit.name(), Const.USER_PROPERTIES_FILENAME }) + "]"; //$NON-NLS-1$ final boolean exceeded = text.length() > maxLength; if (text.length() > maxLength) text = text.substring(0, maxLength - msg.length()); final String fText = text; /* * Create StyleRange ranges (i.e. start-end integer pairs) for * search term highlighting. Only tokenize preview text if we're * not displaying any info messages and if there are tokens to * highlight. */ ranges = new int[0]; if (fileParsed && query != null) { final List<Integer> rangesList = new ArrayList<Integer>(); Analyzer analyzer = RootScope.analyzer; /* * A formatter is supposed to return formatted text, but * since we're only interested in the start and end offsets * of the search terms, we return null and store the offsets * in a list. */ Formatter nullFormatter = new Formatter() { public String highlightTerm(String originalText, TokenGroup tokenGroup) { for (int i = 0; i < tokenGroup.getNumTokens(); i++) { Token token = tokenGroup.getToken(i); if (tokenGroup.getScore(i) == 0) continue; int start = token.startOffset(); int end = token.endOffset(); rangesList.add(start); rangesList.add(end - start); } return null; } }; Highlighter highlighter = new Highlighter(nullFormatter, new QueryScorer(query, Document.contents)); highlighter.setMaxDocCharsToAnalyze(Integer.MAX_VALUE); highlighter.setTextFragmenter(new NullFragmenter()); try { /* * This has a return value, but we ignore it since we * only want the offsets. */ highlighter.getBestFragment(analyzer, Document.contents, fText); } catch (Exception e) { // We can do without the search term highlighting } // List to array (will be used by the method 'setHighlighting(..)') ranges = new int[rangesList.size()]; for (int i = 0; i < ranges.length; i++) ranges[i] = rangesList.get(i); } // Parsing and tokenizing done; display the results final boolean fFileParsed = fileParsed; Display.getDefault().syncExec(new Runnable() { public void run() { // Enable or disable up and down buttons upBt.setEnabled(ranges.length != 0); downBt.setEnabled(ranges.length != 0); textViewer.setText(fText); setHighlighting(fFileParsed && Pref.Bool.HighlightSearchTerms.getValue()); occurrenceCounter.setText(Integer.toString(ranges.length / 2)); if (exceeded) textViewer.append(msg); // character limit exceeded, append hint } }); } }.start(); }
From source file:net.sourceforge.vaticanfetcher.model.search.HighlightService.java
License:Open Source License
@MutableCopy @NotNull//from w ww .ja v a 2s.c o m private static List<Range> highlight(@NotNull Query query, @NotNull String text) throws CheckedOutOfMemoryError { final List<Range> ranges = new ArrayList<Range>(); /* * A formatter is supposed to return formatted text, but since we're * only interested in the start and end offsets of the search terms, we * return null and store the offsets in a list. */ Formatter nullFormatter = new Formatter() { public String highlightTerm(String originalText, TokenGroup tokenGroup) { for (int i = 0; i < tokenGroup.getNumTokens(); i++) { Token token = tokenGroup.getToken(i); if (tokenGroup.getScore(i) == 0) continue; int start = token.startOffset(); int end = token.endOffset(); ranges.add(new Range(start, end - start)); } return null; } }; String key = Fields.CONTENT.key(); Highlighter highlighter = new Highlighter(nullFormatter, new QueryScorer(query, key)); highlighter.setMaxDocCharsToAnalyze(Integer.MAX_VALUE); highlighter.setTextFragmenter(new NullFragmenter()); try { /* * This has a return value, but we ignore it since we only want the * offsets. Might throw an OutOfMemoryError. */ highlighter.getBestFragment(IndexRegistry.analyzer, key, text); } catch (OutOfMemoryError e) { throw new CheckedOutOfMemoryError(e); } catch (Exception e) { Util.printErr(e); } return ranges; }
From source file:org.apache.solr.highlight.GapFragmenter.java
License:Apache License
@Override public Fragmenter getFragmenter(String fieldName, SolrParams params) { numRequests++;/* ww w. j a v a 2 s . co m*/ params = SolrParams.wrapDefaults(params, defaults); int fragsize = params.getFieldInt(fieldName, HighlightParams.FRAGSIZE, 100); return (fragsize <= 0) ? new NullFragmenter() : new LuceneGapFragmenter(fragsize); }
From source file:org.apache.solr.highlight.RegexFragmenter.java
License:Apache License
@Override public Fragmenter getFragmenter(String fieldName, SolrParams params) { numRequests++;/* w w w. j av a 2s . c o m*/ params = SolrParams.wrapDefaults(params, defaults); int fragsize = params.getFieldInt(fieldName, HighlightParams.FRAGSIZE, LuceneRegexFragmenter.DEFAULT_FRAGMENT_SIZE); int increment = params.getFieldInt(fieldName, HighlightParams.INCREMENT, LuceneRegexFragmenter.DEFAULT_INCREMENT_GAP); float slop = params.getFieldFloat(fieldName, HighlightParams.SLOP, LuceneRegexFragmenter.DEFAULT_SLOP); int maxchars = params.getFieldInt(fieldName, HighlightParams.MAX_RE_CHARS, LuceneRegexFragmenter.DEFAULT_MAX_ANALYZED_CHARS); String rawpat = params.getFieldParam(fieldName, HighlightParams.PATTERN, LuceneRegexFragmenter.DEFAULT_PATTERN_RAW); Pattern p = rawpat == defaultPatternRaw ? defaultPattern : Pattern.compile(rawpat); if (fragsize <= 0) { return new NullFragmenter(); } return new LuceneRegexFragmenter(fragsize, increment, slop, maxchars, p); }
From source file:org.compass.core.lucene.engine.highlighter.DefaultLuceneHighlighterSettings.java
License:Apache License
public Fragmenter getFragmenter() throws SearchEngineException { if (fragmenterSetting == null || fragmenterSetting.equals(LuceneEnvironment.Highlighter.Fragmenter.TYPE_SIMPLE)) { int size = settings.getSettingAsInt(LuceneEnvironment.Highlighter.Fragmenter.SIMPLE_SIZE, 100); return new SimpleFragmenter(size); }// w ww . jav a 2 s.c om Fragmenter oFragmenter; if (fragmenterSetting.equals(LuceneEnvironment.Highlighter.Fragmenter.TYPE_NULL)) { oFragmenter = new NullFragmenter(); } else { try { Class fragmenterClass = ClassUtils.forName(fragmenterSetting, settings.getClassLoader()); oFragmenter = (Fragmenter) fragmenterClass.newInstance(); } catch (Exception e) { throw new SearchEngineException( "Failed to create highlighter fragmenter class [" + fragmenterSetting + "]", e); } if (oFragmenter instanceof CompassConfigurable) { ((CompassConfigurable) oFragmenter).configure(settings); } } return oFragmenter; }
From source file:org.elasticsearch.search.fetch.subphase.highlight.PlainHighlighter.java
License:Apache License
@Override public HighlightField highlight(HighlighterContext highlighterContext) { SearchContextHighlight.Field field = highlighterContext.field; SearchContext context = highlighterContext.context; FetchSubPhase.HitContext hitContext = highlighterContext.hitContext; FieldMapper mapper = highlighterContext.mapper; Encoder encoder = field.fieldOptions().encoder().equals("html") ? HighlightUtils.Encoders.HTML : HighlightUtils.Encoders.DEFAULT; if (!hitContext.cache().containsKey(CACHE_KEY)) { Map<FieldMapper, org.apache.lucene.search.highlight.Highlighter> mappers = new HashMap<>(); hitContext.cache().put(CACHE_KEY, mappers); }/* w ww . j ava2 s .com*/ @SuppressWarnings("unchecked") Map<FieldMapper, org.apache.lucene.search.highlight.Highlighter> cache = (Map<FieldMapper, org.apache.lucene.search.highlight.Highlighter>) hitContext .cache().get(CACHE_KEY); org.apache.lucene.search.highlight.Highlighter entry = cache.get(mapper); if (entry == null) { QueryScorer queryScorer = new CustomQueryScorer(highlighterContext.query, field.fieldOptions().requireFieldMatch() ? mapper.fieldType().name() : null); queryScorer.setExpandMultiTermQuery(true); Fragmenter fragmenter; if (field.fieldOptions().numberOfFragments() == 0) { fragmenter = new NullFragmenter(); } else if (field.fieldOptions().fragmenter() == null) { fragmenter = new SimpleSpanFragmenter(queryScorer, field.fieldOptions().fragmentCharSize()); } else if ("simple".equals(field.fieldOptions().fragmenter())) { fragmenter = new SimpleFragmenter(field.fieldOptions().fragmentCharSize()); } else if ("span".equals(field.fieldOptions().fragmenter())) { fragmenter = new SimpleSpanFragmenter(queryScorer, field.fieldOptions().fragmentCharSize()); } else { throw new IllegalArgumentException("unknown fragmenter option [" + field.fieldOptions().fragmenter() + "] for the field [" + highlighterContext.fieldName + "]"); } Formatter formatter = new SimpleHTMLFormatter(field.fieldOptions().preTags()[0], field.fieldOptions().postTags()[0]); entry = new org.apache.lucene.search.highlight.Highlighter(formatter, encoder, queryScorer); entry.setTextFragmenter(fragmenter); // always highlight across all data entry.setMaxDocCharsToAnalyze(Integer.MAX_VALUE); cache.put(mapper, entry); } // a HACK to make highlighter do highlighting, even though its using the single frag list builder int numberOfFragments = field.fieldOptions().numberOfFragments() == 0 ? 1 : field.fieldOptions().numberOfFragments(); ArrayList<TextFragment> fragsList = new ArrayList<>(); List<Object> textsToHighlight; Analyzer analyzer = context.mapperService().documentMapper(hitContext.hit().type()).mappers() .indexAnalyzer(); try { textsToHighlight = HighlightUtils.loadFieldValues(field, mapper, context, hitContext); for (Object textToHighlight : textsToHighlight) { String text = textToHighlight.toString(); try (TokenStream tokenStream = analyzer.tokenStream(mapper.fieldType().name(), text)) { if (!tokenStream.hasAttribute(CharTermAttribute.class) || !tokenStream.hasAttribute(OffsetAttribute.class)) { // can't perform highlighting if the stream has no terms (binary token stream) or no offsets continue; } TextFragment[] bestTextFragments = entry.getBestTextFragments(tokenStream, text, false, numberOfFragments); for (TextFragment bestTextFragment : bestTextFragments) { if (bestTextFragment != null && bestTextFragment.getScore() > 0) { fragsList.add(bestTextFragment); } } } } } catch (Exception e) { if (ExceptionsHelper.unwrap(e, BytesRefHash.MaxBytesLengthExceededException.class) != null) { // this can happen if for example a field is not_analyzed and ignore_above option is set. // the field will be ignored when indexing but the huge term is still in the source and // the plain highlighter will parse the source and try to analyze it. return null; } else { throw new FetchPhaseExecutionException(context, "Failed to highlight field [" + highlighterContext.fieldName + "]", e); } } if (field.fieldOptions().scoreOrdered()) { CollectionUtil.introSort(fragsList, new Comparator<TextFragment>() { @Override public int compare(TextFragment o1, TextFragment o2) { return Math.round(o2.getScore() - o1.getScore()); } }); } String[] fragments; // number_of_fragments is set to 0 but we have a multivalued field if (field.fieldOptions().numberOfFragments() == 0 && textsToHighlight.size() > 1 && fragsList.size() > 0) { fragments = new String[fragsList.size()]; for (int i = 0; i < fragsList.size(); i++) { fragments[i] = fragsList.get(i).toString(); } } else { // refine numberOfFragments if needed numberOfFragments = fragsList.size() < numberOfFragments ? fragsList.size() : numberOfFragments; fragments = new String[numberOfFragments]; for (int i = 0; i < fragments.length; i++) { fragments[i] = fragsList.get(i).toString(); } } if (fragments.length > 0) { return new HighlightField(highlighterContext.fieldName, Text.convertFromStringArray(fragments)); } int noMatchSize = highlighterContext.field.fieldOptions().noMatchSize(); if (noMatchSize > 0 && textsToHighlight.size() > 0) { // Pull an excerpt from the beginning of the string but make sure to split the string on a term boundary. String fieldContents = textsToHighlight.get(0).toString(); int end; try { end = findGoodEndForNoHighlightExcerpt(noMatchSize, analyzer, mapper.fieldType().name(), fieldContents); } catch (Exception e) { throw new FetchPhaseExecutionException(context, "Failed to highlight field [" + highlighterContext.fieldName + "]", e); } if (end > 0) { return new HighlightField(highlighterContext.fieldName, new Text[] { new Text(fieldContents.substring(0, end)) }); } } return null; }
From source file:org.elasticsearch.search.highlight.PlainHighlighter.java
License:Apache License
public HighlightField highlight(HighlighterContext highlighterContext) { SearchContextHighlight.Field field = highlighterContext.field; SearchContext context = highlighterContext.context; FetchSubPhase.HitContext hitContext = highlighterContext.hitContext; FieldMapper<?> mapper = highlighterContext.mapper; Encoder encoder = field.fieldOptions().encoder().equals("html") ? HighlightUtils.Encoders.HTML : HighlightUtils.Encoders.DEFAULT; if (!hitContext.cache().containsKey(CACHE_KEY)) { Map<FieldMapper<?>, org.apache.lucene.search.highlight.Highlighter> mappers = Maps.newHashMap(); hitContext.cache().put(CACHE_KEY, mappers); }// w ww . j a v a 2s.c om @SuppressWarnings("unchecked") Map<FieldMapper<?>, org.apache.lucene.search.highlight.Highlighter> cache = (Map<FieldMapper<?>, org.apache.lucene.search.highlight.Highlighter>) hitContext .cache().get(CACHE_KEY); org.apache.lucene.search.highlight.Highlighter entry = cache.get(mapper); if (entry == null) { Query query = highlighterContext.query.originalQuery(); QueryScorer queryScorer = new CustomQueryScorer(query, field.fieldOptions().requireFieldMatch() ? mapper.names().indexName() : null); queryScorer.setExpandMultiTermQuery(true); Fragmenter fragmenter; if (field.fieldOptions().numberOfFragments() == 0) { fragmenter = new NullFragmenter(); } else if (field.fieldOptions().fragmenter() == null) { fragmenter = new SimpleSpanFragmenter(queryScorer, field.fieldOptions().fragmentCharSize()); } else if ("simple".equals(field.fieldOptions().fragmenter())) { fragmenter = new SimpleFragmenter(field.fieldOptions().fragmentCharSize()); } else if ("span".equals(field.fieldOptions().fragmenter())) { fragmenter = new SimpleSpanFragmenter(queryScorer, field.fieldOptions().fragmentCharSize()); } else { throw new ElasticsearchIllegalArgumentException( "unknown fragmenter option [" + field.fieldOptions().fragmenter() + "] for the field [" + highlighterContext.fieldName + "]"); } Formatter formatter = new SimpleHTMLFormatter(field.fieldOptions().preTags()[0], field.fieldOptions().postTags()[0]); entry = new org.apache.lucene.search.highlight.Highlighter(formatter, encoder, queryScorer); entry.setTextFragmenter(fragmenter); // always highlight across all data entry.setMaxDocCharsToAnalyze(Integer.MAX_VALUE); cache.put(mapper, entry); } // a HACK to make highlighter do highlighting, even though its using the single frag list builder int numberOfFragments = field.fieldOptions().numberOfFragments() == 0 ? 1 : field.fieldOptions().numberOfFragments(); ArrayList<TextFragment> fragsList = new ArrayList<TextFragment>(); List<Object> textsToHighlight; try { textsToHighlight = HighlightUtils.loadFieldValues(field, mapper, context, hitContext); for (Object textToHighlight : textsToHighlight) { String text = textToHighlight.toString(); Analyzer analyzer = context.mapperService().documentMapper(hitContext.hit().type()).mappers() .indexAnalyzer(); TokenStream tokenStream = analyzer.tokenStream(mapper.names().indexName(), text); if (!tokenStream.hasAttribute(CharTermAttribute.class) || !tokenStream.hasAttribute(OffsetAttribute.class)) { // can't perform highlighting if the stream has no terms (binary token stream) or no offsets continue; } TextFragment[] bestTextFragments = entry.getBestTextFragments(tokenStream, text, false, numberOfFragments); for (TextFragment bestTextFragment : bestTextFragments) { if (bestTextFragment != null && bestTextFragment.getScore() > 0) { fragsList.add(bestTextFragment); } } } } catch (Exception e) { throw new FetchPhaseExecutionException(context, "Failed to highlight field [" + highlighterContext.fieldName + "]", e); } if (field.fieldOptions().scoreOrdered()) { CollectionUtil.introSort(fragsList, new Comparator<TextFragment>() { public int compare(TextFragment o1, TextFragment o2) { return Math.round(o2.getScore() - o1.getScore()); } }); } String[] fragments; // number_of_fragments is set to 0 but we have a multivalued field if (field.fieldOptions().numberOfFragments() == 0 && textsToHighlight.size() > 1 && fragsList.size() > 0) { fragments = new String[fragsList.size()]; for (int i = 0; i < fragsList.size(); i++) { fragments[i] = fragsList.get(i).toString(); } } else { // refine numberOfFragments if needed numberOfFragments = fragsList.size() < numberOfFragments ? fragsList.size() : numberOfFragments; fragments = new String[numberOfFragments]; for (int i = 0; i < fragments.length; i++) { fragments[i] = fragsList.get(i).toString(); } } if (fragments.length > 0) { return new HighlightField(highlighterContext.fieldName, StringText.convertFromStringArray(fragments)); } int noMatchSize = highlighterContext.field.fieldOptions().noMatchSize(); if (noMatchSize > 0 && textsToHighlight.size() > 0) { // Pull an excerpt from the beginning of the string but make sure to split the string on a term boundary. String fieldContents = textsToHighlight.get(0).toString(); Analyzer analyzer = context.mapperService().documentMapper(hitContext.hit().type()).mappers() .indexAnalyzer(); int end; try { end = findGoodEndForNoHighlightExcerpt(noMatchSize, analyzer.tokenStream(mapper.names().indexName(), fieldContents)); } catch (Exception e) { throw new FetchPhaseExecutionException(context, "Failed to highlight field [" + highlighterContext.fieldName + "]", e); } if (end > 0) { return new HighlightField(highlighterContext.fieldName, new Text[] { new StringText(fieldContents.substring(0, end)) }); } } return null; }