关键字高亮显示也就是在页面显示时,事先对要显示的内容处理,抽取出关键字并加亮,这里抽取关键字也是用lucene,lucene自带有heightlight包就可以实现此功能。
Highlighter包括了三个主要部分:段划分器(Fragmenter)、计分器(Scorer)和格式化器(Formatter)。
通常要用到的几个重要类有:
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
1)SimpleFragmenter
Highlighter利用Fragmenter将原始文本分割成多个片段。内置的SimpleFragmenter将原始文本分割成相同大小的片段,片段默认的大小为100个字符。这个大小是可控制的。
2)SimpleHTMLFormatter:用来控制你要加亮的关键字的高亮方式
此类有2个构造方法
1:SimpleHTMLFormatter()默认的构造方法.加亮方式:<B>关键字</B>
2:SimpleHTMLFormatter(String preTag, String postTag).加亮方式:preTag关键字postTag
3)QueryScorer
QueryScorer 是内置的计分器。计分器的工作首先是将片段排序。QueryScorer使用的项是从用户输入的查询中得到的;它会从原始输入的单词、词组和布尔查询中提取项,并且基于相应的加权因子(boost factor)给它们加权。为了便于QueryScoere使用,还必须对查询的原始形式进行重写。比如,带通配符查询、模糊查询、前缀查询以及范围查询 等,都被重写为BoolenaQuery中所使用的项。在将Query实例传递到QueryScorer之前,可以调用Query.rewrite (IndexReader)方法来重写Query对象
4)Highlighter
api:
Class used to markup highlighted terms found in the best sections of a text, using configurable Fragmenter
, Scorer
, Formatter
, Encoder
and tokenizers.
实例代码:
private String hightlightstr(String str, String infor) { String fieldName = "text"; String text = str; Analyzer analyzer = new MMAnalyzer(); String result = str; Directory directory = new RAMDirectory(); try { // 索引 IndexWriter.MaxFieldLength m = new IndexWriter.MaxFieldLength(1000); IndexWriter iwriter = new IndexWriter(directory, analyzer, true, m); Document doc = new Document(); doc.add(new Field(fieldName, text, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); iwriter.addDocument(doc); iwriter.close(); IndexSearcher isearcher = new IndexSearcher(directory); QueryParser queryParse = new QueryParser(fieldName, analyzer); Query query = queryParse.parse(infor); ScoreDoc[] sd = isearcher.search(query, isearcher.maxDoc()).scoreDocs; for (int i = 0; i < sd.length; i++) { Document docTemp = isearcher.doc(i); String value = docTemp.get(fieldName); // 高亮显示格式 SimpleHTMLFormatter sHtmlF = new SimpleHTMLFormatter( "<font color='red'>", "</font>"); Highlighter highlighter = new Highlighter(sHtmlF, new QueryScorer(query)); highlighter.setTextFragmenter(new SimpleFragmenter(100)); if (value != null) { TokenStream tokenStream = analyzer.tokenStream(fieldName, new StringReader(value)); result = highlighter.getBestFragment(tokenStream, value); } } isearcher.close(); directory.close(); } catch (Exception e) { e.printStackTrace(); } return result; }