Lucene增加高亮显示后结果更高明显

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

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

Java代码 复制代码
  1. publicvoidsearcher()throwsIOException{
  2. IndexReaderreader=IndexReader.open(directory);
  3. IndexSearchersearcher=newIndexSearcher(directory);
  4. TermQueryquery=newTermQuery(newTerm("subject","java"));
  5. Hitshits=searcher.search(query);
  6. //高亮显示设置
  7. SimpleHTMLFormattersimpleHTMLFormatter=newSimpleHTMLFormatter("<fontcolor='red'>","</font>");
  8. Highlighterhighlighter=newHighlighter(simpleHTMLFormatter,newQueryScorer(query));
  9. //这个100是指定关键字字符串的context的长度,你可以自己设定,因为不可能返回整篇正文内容
  10. highlighter.setTextFragmenter(newSimpleFragmenter(100));
  11. for(inti=0;i<hits.length();i++){
  12. Documentdoc=hits.doc(i);
  13. TermPositionVectortermFreqVector=(TermPositionVector)reader.getTermFreqVector(hits.id(i),"subject");
  14. TokenStreamtokenStream=TokenSources.getTokenStream(termFreqVector);
  15. Stringresult=highlighter.getBestFragment(tokenStream,doc.get("subject"));
  16. System.out.println(doc.get("title"));
  17. System.out.println(result);
  18. }
  19. }
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); } }


从别处转的发现reader.getTermFreqVector(hits.id(i),"subject")总是返回空值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值