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

http://callan.iteye.com/blog/155611

 

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>一门编程语言

 

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