本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7590975
建立时间:2006年5月29日




[Apache(jakarta)]Lucene中文分词的highlight显示
软件技术

lhwork 发表于 2006/12/14 11:43:01

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 d = new Document();               //Field f = new Field(FIELD_NAME, text, true, true, true);               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("\t" + result);               }        }          最后把highlight包中的一个额外的判断去掉。对于中文来说没有明显的单词界限,所以下面这个判断是错误的: tokenGroup.isDistinct(token)          这样中文分词就不会影响到查询速度了。        附件是适合lucene-core-2.0.0.jar使用的highlighter.jar


阅读全文(2220) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.328 second(s), page refreshed 144762697 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号