鷹翔宇空

          學(xué)習(xí)和生活

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

          1、問題的來源 增加分詞以后結(jié)果的準(zhǔn)確度提高了,但是用戶反映返回結(jié)果的速度很慢。原因是, Lucene 做每一篇文檔的相關(guān)關(guān)鍵詞的高亮顯示時(shí),在運(yùn)行時(shí)執(zhí)行了很多遍的分詞操作。這樣降低了性能。
          2 、解決方法 
          在 Lucene1.4.3 版本中的一個(gè)新功能可以解決這個(gè)問題。 Term Vector 現(xiàn)在支持保存 Token.getPositionIncrement() 和 Token.startOffset() 以及 Token.endOffset() 信息。利用 Lucene 中新增加的 Token 信息的保存結(jié)果以后,就不需要為了高亮顯示而在運(yùn)行時(shí)解析每篇文檔。通過 Field 方法控制是否保存該信息。修改 HighlighterTest.java 的代碼如下:
          
          代碼內(nèi)容
          // 增加文檔時(shí)保存 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 位置信息節(jié)省 Highlight 時(shí)間。
          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); 進(jìn)一步提速。
          ?? 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 包中的一個(gè)額外的判斷去掉。對于中文來說沒有明顯的單詞界限,所以下面這個(gè)判斷是錯(cuò)誤的:
          
          tokenGroup.isDistinct(token)
          
          這樣中文分詞就不會(huì)影響到查詢速度了。
          posted on 2006-02-20 14:30 TrampEagle 閱讀(1209) 評論(0)  編輯  收藏 所屬分類: opensource
          主站蜘蛛池模板: 遂昌县| 屏山县| 呼图壁县| 共和县| 大丰市| 遵义市| 芦山县| 昂仁县| 年辖:市辖区| 南和县| 巨鹿县| 长武县| 平阴县| 开原市| 南溪县| 柳林县| 玉门市| 东阿县| 顺平县| 汶上县| 军事| 东海县| 青神县| 定结县| 顺平县| 汤原县| 琼海市| 措勤县| 景泰县| 双江| 鲜城| 太原市| 梨树县| 沧源| 旬阳县| 新丰县| 栖霞市| 辽宁省| 永定县| 邢台县| 汉中市|