Lucene使用项向量提高高亮显示性能

Lucene增加高亮显示后结果更高明显了,但是返回结果的速度比较慢.原因是Lucene做每一篇文档的相关关键词的高亮显示时,在运行时执行了很多遍的分词操作,降低了性能.

TermVector保存Token.getPositionIncrement() Token.startOffset() 以及Token.endOffset() 信息。利用Lucene中新增加的Token信息的保存结果以后,就不需要为了高亮显示而在运行时解析每篇文档。通过Field方法控制是否保存该信息

 

public void searcher() throws IOException{
		
		IndexReader reader = IndexReader.open(directory);
		
		IndexSearcher searcher = new IndexSearcher(directory);
		
		TermQuery query = new TermQuery(new Term("subject","java"));
		
		Hits hits = searcher.search(query);
		
		//高亮显示设置
	    SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'>","</font>");   
	    
		Highlighter highlighter =new Highlighter(simpleHTMLFormatter,new QueryScorer(query));

		 // 这个100是指定关键字字符串的context的长度,你可以自己设定,因为不可能返回整篇正文内容
        highlighter.setTextFragmenter(new SimpleFragmenter(100));

		for(int i = 0; i < hits.length(); i++){
			
			Document doc = hits.doc(i);
			
			TermPositionVector termFreqVector = (TermPositionVector)reader.getTermFreqVector(hits.id(i), "subject");
			
			TokenStream tokenStream = TokenSources.getTokenStream(termFreqVector);
			
			String result = highlighter.getBestFragment(tokenStream, doc.get("subject"));

			System.out.println(doc.get("title"));
			
			System.out.println(result);
			
		}
	}


搜索结果:

java
<font color='red'>java</font>一门编程语言

你可能感兴趣的:(编程,Lucene)