CharacterRunAutomaton[] automata) { OffsetSource res = super.getOptimizedOffsetSource(field, terms, phraseHelper, automata); if (res == OffsetSource.ANALYSIS) {
@Override protected FieldHighlighter getFieldHighlighter(String field, Query query, Set<Term> allTerms, int maxPassages) { BytesRef[] terms = filterExtractedTerms(getFieldMatcher(field), allTerms); Set<HighlightFlag> highlightFlags = getFlags(field); PhraseHelper phraseHelper = getPhraseHelper(field, query, highlightFlags); CharacterRunAutomaton[] automata = getAutomata(field, query, highlightFlags); OffsetSource offsetSource = getOptimizedOffsetSource(field, terms, phraseHelper, automata); BreakIterator breakIterator = new SplittingBreakIterator(getBreakIterator(field), UnifiedHighlighter.MULTIVAL_SEP_CHAR); UHComponents components = new UHComponents(field, getFieldMatcher(field), query, terms, phraseHelper, automata, highlightFlags); FieldOffsetStrategy strategy = getOffsetStrategy(offsetSource, components); return new CustomFieldHighlighter(field, strategy, breakIteratorLocale, breakIterator, getScorer(field), maxPassages, (noMatchSize > 0 ? 1 : 0), getFormatter(field), noMatchSize, fieldValue); }
/** * Forces the offset source for this highlighter */ @Override protected OffsetSource getOffsetSource(String field) { if (offsetSource == null) { return super.getOffsetSource(field); } return offsetSource; }
@Test public void testLinesSpanningMatchFormatted() { Passage p = new Passage(); p.setStartOffset(0); p.setEndOffset(DOC2.length()); p.addMatch(0, p.getEndOffset(), new BytesRef(DOC2),1); assertEquals("getNumMatches()", 1, p.getNumMatches()); /** * We're using the entire document, but see how it behaves with * contextCount==1 */ ContextArgs args = new ContextArgs((short)1, (short)10); ContextFormatter fmt = new ContextFormatter(args); fmt.setUrl("http://example.com"); Object res = fmt.format(new Passage[] {p}, DOC2); assertNotNull("format() result", res); final String DOC2CTX = "<a class=\"s\" href=\"http://example.com#1\"><span class=\"l\">" + "1</span> <b>abc</b></a><br/>" + "<a class=\"s\" href=\"http://example.com#2\"><span class=\"l\">" + "2</span> <b>def</b></a><br/>" + "<a class=\"s\" href=\"http://example.com#3\"><span class=\"l\">" + "3</span> <b>ghi</b></a><br/>"; String ctx = res.toString(); assertLinesEqual("format().toString()", DOC2CTX, ctx); }
int start = passage.getStartOffset(); int end = passage.getEndOffset(); if (start >= end) { continue; for (int i = 0; i < passage.getNumMatches(); ++i) { int mstart = passage.getMatchStarts()[i]; int mm = splitter.findLineOffset(mstart); int mend = passage.getMatchEnds()[i]; int nn = splitter.findLineOffset(mend - 1); if (mstart < mend && mm >= m && mm <= n && nn >= m && nn <= n) {
@Override protected Collection<Query> preMultiTermQueryRewrite(Query query) { return rewriteCustomQuery(query); }
@Override public void setText(CharacterIterator newText) { reset(); mainBreak.setText(newText); innerBreak.setText(newText); }
/** * Returns a {@link BreakIterator#getSentenceInstance(Locale)} bounded to maxLen. * Secondary boundaries are found using a {@link BreakIterator#getWordInstance(Locale)}. */ public static BreakIterator getSentence(Locale locale, int maxLen) { final BreakIterator sBreak = BreakIterator.getSentenceInstance(locale); final BreakIterator wBreak = BreakIterator.getWordInstance(locale); return new BoundedBreakIteratorScanner(sBreak, wBreak, maxLen); }
PHRASE.length() + LF_CHAR_COUNT, "*")); Passage p = new Passage(); p.setStartOffset(phOff); p.setEndOffset(phOff + STARS.length()); p.addMatch(phOff, p.getEndOffset(), new BytesRef(STARS),1); assertEquals("getNumMatches()", 1, p.getNumMatches());
@Override protected Collection<Query> preSpanQueryRewrite(Query query) { return rewriteCustomQuery(query); }
@Override public void setText(String newText) { reset(); mainBreak.setText(newText); innerBreak.setText(newText); }
assertTrue(WORD, woff >= 0); Passage p = new Passage(); p.setStartOffset(woff); p.setEndOffset(woff + WORD.length()); p.addMatch(woff, p.getEndOffset(), new BytesRef(WORD),1); assertEquals("getNumMatches()", 1, p.getNumMatches());
@Test public void testOneWord() { final String WORD = "gravida"; int woff = DOC.indexOf(WORD); assertTrue(WORD, woff >= 0); Passage p = new Passage(); p.setStartOffset(woff); p.setEndOffset(woff + WORD.length()); p.addMatch(woff, p.getEndOffset(), new BytesRef(WORD),1); assertEquals("getNumMatches()", 1, p.getNumMatches()); PassageConverter cvt = getConverter((short)0); SortedMap<Integer, LineHighlight> linemap = cvt.convert(new Passage[] {p}, splitter); assertEquals("linemap size()", 1, linemap.size()); int lineno = linemap.firstKey(); assertEquals("lineno", 2, lineno); LineHighlight lhi = linemap.get(lineno); assertNotNull("get LineHighlight", lhi); assertEquals("getLelide()", 0, lhi.getLelide()); assertEquals("getRelide()", 0, lhi.getRelide()); assertEquals("countMarkups()", 1, lhi.countMarkups()); PhraseHighlight phi = lhi.getMarkup(0); assertNotNull("get PhraseHighlight", phi); assertEquals("getLineStart()", 32, phi.getLineStart()); assertEquals("getLineEnd()", 32 + WORD.length(), phi.getLineEnd()); }
@Test public void testOneWordElided() { final String WORD = "dignissim"; int woff = DOC.indexOf(WORD); assertTrue(WORD, woff >= 0); Passage p = new Passage(); p.setStartOffset(woff); p.setEndOffset(woff + WORD.length()); p.addMatch(woff, p.getEndOffset(), new BytesRef(WORD),1); assertEquals("getNumMatches()", 1, p.getNumMatches()); PassageConverter cvt = getConverter((short)0); SortedMap<Integer, LineHighlight> linemap = cvt.convert(new Passage[] {p}, splitter); assertEquals("linemap size()", 1, linemap.size()); int lineno = linemap.firstKey(); assertEquals("lineno", 5, lineno); LineHighlight lhi = linemap.get(lineno); assertNotNull("get LineHighlight", lhi); assertEquals("getLelide()", 41, lhi.getLelide()); assertEquals("getRelide()", 139, lhi.getRelide()); assertEquals("context width minus 2", 139 - 41, cvt.getArgs().getContextWidth() - 2); assertEquals("countMarkups()", 1, lhi.countMarkups()); PhraseHighlight phi = lhi.getMarkup(0); assertNotNull("get PhraseHighlight", phi); assertEquals("getLineStart()", 113, phi.getLineStart()); assertEquals("getLineEnd()", 113 + WORD.length(), phi.getLineEnd()); }
assertTrue(WORD, woff >= 0); Passage p = new Passage(); p.setStartOffset(woff); p.setEndOffset(woff + WORD.length()); p.addMatch(woff, p.getEndOffset(), new BytesRef(WORD),1); assertEquals("getNumMatches()", 1, p.getNumMatches());
assertTrue(WORD, woff >= 0); Passage p = new Passage(); p.setStartOffset(woff); p.setEndOffset(woff + WORD.length()); p.addMatch(woff, p.getEndOffset(), new BytesRef(WORD),1); assertEquals("getNumMatches()", 1, p.getNumMatches());
assertTrue(WORD, woff >= 0); Passage p = new Passage(); p.setStartOffset(woff); p.setEndOffset(woff + WORD.length()); p.addMatch(woff, p.getEndOffset(), new BytesRef(WORD),1); assertEquals("getNumMatches()", 1, p.getNumMatches());
assertTrue(WORD2, woff2 >= 0); Passage p = new Passage(); p.setStartOffset(woff1); p.setEndOffset(woff2 + WORD2.length()); p.addMatch(woff1, woff1 + WORD1.length(), new BytesRef(WORD1),1); p.addMatch(woff2, woff2 + WORD2.length(), new BytesRef(WORD2),1); assertEquals("getNumMatches()", 2, p.getNumMatches());
assertTrue(PHRASE, poff >= 0); Passage p = new Passage(); p.setStartOffset(poff); p.setEndOffset(poff + PHRASE.length()); p.addMatch(poff, p.getEndOffset(), new BytesRef(PHRASE),1); assertEquals("getNumMatches()", 1, p.getNumMatches());
@Test public void testLinesSpanningMatch() { Passage p = new Passage(); p.setStartOffset(0); p.setEndOffset(DOC2.length()); p.addMatch(0, p.getEndOffset(), new BytesRef(DOC2),1); assertEquals("getNumMatches()", 1, p.getNumMatches());