鷹翔宇空

          學習和生活

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks
          引自:http://www.gamvan.com/developer/java/opener/2005/12/849.html

          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(" " + result);
          ?}
          }

          最后把 highlight 包中的一個額外的判斷去掉。對于中文來說沒有明顯的單詞界限,所以下面這個判斷是錯誤的:
          
          tokenGroup.isDistinct(token)
          
          這樣中文分詞就不會影響到查詢速度了。
          posted on 2006-02-20 14:30 TrampEagle 閱讀(1214) 評論(0)  編輯  收藏 所屬分類: opensource
          主站蜘蛛池模板: 繁峙县| 临夏县| 彩票| 曲松县| 镇巴县| 鹤岗市| 启东市| 新干县| 浦北县| 凌云县| 黄大仙区| 漳平市| 溧水县| 昌图县| 南通市| 海伦市| 巍山| 北海市| 武穴市| 土默特左旗| 菏泽市| 红桥区| 思南县| 鄂伦春自治旗| 郁南县| 兰坪| 石狮市| 阿瓦提县| 响水县| 攀枝花市| 兖州市| 兰坪| 梁山县| 黔西县| 沁源县| 应城市| 梁平县| 潮州市| 桂林市| 旺苍县| 白玉县|