public String[] getFragments(int n) {
String [] fragments = null;
try {
// Is IndexReader reachable ?
if(!(searcher instanceof IndexSearcher))
return fragments;
IndexReader reader = ((IndexSearcher)searcher).getIndexReader();
if(reader == null)
return fragments;
String fieldName = "@" + QName.createQName(ContentModel.PROP_CONTENT.getNamespaceURI(), ISO9075.encode(ContentModel.PROP_CONTENT.getLocalName()));
TermPositionVector termPosVector = (TermPositionVector)reader.getTermFreqVector(hits.id(n), fieldName);
if(termPosVector == null)
return fragments;
if(analyzer == null) {
DictionaryService ds = ((ServiceRegistry)config.getApplicationContext().getBean(ServiceRegistry.SERVICE_REGISTRY)).getDictionaryService();
analyzer = new LuceneAnalyser(ds, searchParameters.getMlAnalaysisMode() == null ? config.getDefaultMLSearchAnalysisMode() : searchParameters.getMlAnalaysisMode());
}
Document doc = hits.doc(n);
String content = doc.get(fieldName);
content = content == null ? "" : content;
SpanScorer scorer = new SpanScorer(new QueryParser(fieldName, analyzer).parse(searchParameters.getQuery()),
fieldName, new CachingTokenFilter(TokenSources.getTokenStream(termPosVector)));
Fragmenter fragmenter = new SimpleSpanFragmenter(scorer, 70);
Highlighter highlighter = new Highlighter(new SpanGradientFormatter(scorer.getMaxTermWeight(), null, null, "#FFFFFF", "#F2FA06"), scorer);
highlighter.setTextFragmenter(fragmenter);
highlighter.setMaxDocCharsToAnalyze(Integer.MAX_VALUE);
fragments = highlighter.getBestFragments(TokenSources.getTokenStream(termPosVector), content, 3);
}
catch (IOException e) {
throw new SearcherException("Query parse Error retrieving hit highlighted fragments", e);
} catch (ParseException e) {
throw new SearcherException("Query parse Error retrieving hit highlighted fragments", e);
}
return fragments;
}