Mysoo2 站内搜索引擎安装指南
百度阿拉丁平台剑指垂直搜索
谷歌测试在搜索建议中放广告
谷歌与百度的八年“暗战”
Google公布2008年度搜索排行榜
传戴尔PC将放弃谷歌选择微软Live搜索引擎
雅虎高级搜索专家陆奇将任微软数字部门高管
微软不娶雅虎 只想买搜索业务
微软退出搜索市场能对Google造更大伤害
雅虎打造BOSS垂直搜索引擎
谷歌百度口水战升级 比拼"谁更懂中文"
从百度“竞价门”看企业的社会责任感
山寨版搜索引擎“百谷虎”雷倒网友
雅虎搜索技术高管跳槽至微软
面对“搜索门” 百度公司力挽声誉
内容更新频率对SEO的影响


 ·实战搜索引擎:初识Lucene
 ·用Lucene加速Web站点搜索应用...
 ·用Lucene.net实现站内全文搜索
 ·教你用PHP调用Lucene包实现全...
 ·简单之美:布尔代数和搜索引擎的索引
 ·解析GOOGLE将要采用的新算法
 ·用PHP+JavaScript打造A...
 ·语用网与计算自然语言
 ·利用全文检索技术实现校园网内的搜索
 ·一种基于DNS的分层式网页搜索引擎研究




如何提高Lucene中文分词highlight显示的性能


 共1页 

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)


       这样中文分词就不会影响到站内搜索的速度了。

 共1页 

来源: | 作者: | 发表时间: 2006-10-12 19:17:00

 

 


Copyright © 2000-2008 Mysoo.com.cn, All Rights Reserved Mysoo.com.cn 版权所有                                  把Mysoo添加到 Google   沪ICP备06051139