引自: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 的代碼如下:
最后把 highlight 包中的一個(gè)額外的判斷去掉。對于中文來說沒有明顯的單詞界限,所以下面這個(gè)判斷是錯(cuò)誤的:
tokenGroup.isDistinct(token)
這樣中文分詞就不會(huì)影響到查詢速度了。
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ì)影響到查詢速度了。