lucene关键字高亮显示

关键字高亮显示也就是在页面显示时,事先对要显示的内容处理,抽取出关键字并加亮,这里抽取关键字也是用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;
	}

猜你喜欢

转载自fffdd.iteye.com/blog/394834