Chinaunix首页 | 论坛 | 博客
  • 博客访问: 355177
  • 博文数量: 152
  • 博客积分: 6020
  • 博客等级: 准将
  • 技术积分: 850
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-11 19:20
文章分类

全部博文(152)

文章存档

2017年(1)

2010年(1)

2007年(3)

2006年(147)

我的朋友

分类: BSD

2006-04-24 23:10:54

1、问题的来源  增加分词以后结果的准确度提高了,但是用户反映返回结果的速度很慢。原因是,  Lucene  做每一篇文档的相关关键词的高亮显示时,在运行时执行了很多遍的分词操作。这样降低了性能。
2  、解决方法  
??  
??在  Lucene1.4.3  版本中的一个新功能可以解决这个问题。  Term  Vector  现在支持保存  Token.getPositionIncrement()  和  Token.startOffset()  以及  Token.endOffset()  信息。利用  Lucene  中新增加的  Token  信息的保存结果以后,就不需要为了高亮显示而在运行时解析每篇文档。通过  Field  方法控制是否保存该信息。修改  HighlighterTest.java  的代码如下:  
?
程序代码:
// 增加文档时保存 Term 位置信息。 
?private void addDoc(IndexWriter writer, String text) throws IOException 
?{ 
??document.nbsp;d = new document.); 
??//Field f = new Field(FIELD_NAME, text, truetruetrue); 
??Field f = new Field(FIELD_NAME, text , 
??Field.Store.YES, Field.Index.TOKENIZED, 
??Field.TermVector.WITH_POSITIONS_OFFSETS); 
??d.add(f); 
??writer.adddocument.d); 
 } 
??// 利用 Term 位置信息节省 Highlight 时间。 
??void doStandardHighlights() throws Exception 
??{ 
?    Highlighter highlighter =new Highlighter(this,new QueryScorer(query)); 
??highlighter.setTextFragmenter(new SimpleFragmenter(20)); 
??for (int i = 0; i < hits.length(); i++) 
??{ 
??String text = hits.doc(i).get(FIELD_NAME); 
??int maxNumFragmentsRequired = 2; 
??String fragmentSeparator = "..."
??TermPositionVector tpv = (TermPositionVector)reader.getTermFreqVector(hits.id(i),FIELD_NAME); 
?// 如果没有 stop words 去除还可以改成 TokenSources.getTokenStream(tpv,true); 进一步提速。 
?   TokenStream tokenStream=TokenSources.getTokenStream(tpv); 
?   //analyzer.tokenStream(FIELD_NAME,new StringReader(text)); 
?   String result = 
?   highlighter.getBestFragments( 
?   tokenStream, 
?   text, 
?   maxNumFragmentsRequired, 
       fragmentSeparator); 
?   System.out.println(" " + result); 
 ?} 
}  

最后把  highlight  包中的一个额外的判断去掉。对于中文来说没有明显的单词界限,所以下面这个判断是错误的:  ??  
??
程序代码:
tokenGroup.isDistinct(token) 
??  

??这样中文分词就不会影响到查询速度了。
阅读(1443) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~