2014-02-10 63 views
9

當搜索頻繁項時,Lucene(4.6)熒光筆的性能非常低下。 搜索速度很快(100ms),但突出顯示可能需要一個多小時(!)。lucene中的非常慢的突出顯示性能

詳情:使用了優秀的文本語料庫(1.5GB純文本)。性能不取決於文本是否被分割成更多小塊。 (同時測試500MB和5MB) 存儲位置和偏移量。 如果搜索到非常頻繁的術語或模式,則快速檢索TopDoc(100ms),但每個「searcher.doc(id)」調用都很昂貴(5-50s),getBestFragments()非常昂貴(超過1小時)。即使它們被存儲併爲此目的編制索引。 (硬件:酷睿i7,8GM MEM)

大背景: 這將成爲一個語言分析研究。使用特殊的詞幹:它也存儲詞性信息。例如,如果搜索到「adj adj形式的形容詞名詞」,它將在上下文中給出它在文本中的所有出現。

我可以調整它的性能,還是應該選擇其他工具?

使用的代碼:

  //indexing 
      FieldType offsetsType = new FieldType(TextField.TYPE_STORED); 
      offsetsType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS_AND_OFFSETS); 

      offsetsType.setStored(true); 
      offsetsType.setIndexed(true); 
      offsetsType.setStoreTermVectors(true); 
      offsetsType.setStoreTermVectorOffsets(true); 
      offsetsType.setStoreTermVectorPositions(true); 
      offsetsType.setStoreTermVectorPayloads(true); 


      doc.add(new Field("content", fileContent, offsetsType)); 


      //quering 
      TopDocs results = searcher.search(query, limitStart+limit); 

      int endPos = Math.min(results.scoreDocs.length, limitStart+limit); 
      int startPos = Math.min(results.scoreDocs.length, limitStart); 

      for (int i = startPos; i < endPos; i++) { 
       int id = results.scoreDocs[i].doc; 

       // bottleneck #1 (5-50s): 
       Document doc = searcher.doc(id); 

       FastVectorHighlighter h = new FastVectorHighlighter(); 

       // bottleneck #2 (more than 1 hour): 
       String[] hs = h.getBestFragments(h.getFieldQuery(query), m, id, "content", contextSize, 10000); 

相關(解答)問題:https://stackoverflow.com/questions/19416804/very-slow-solr-performance-when-highlighting

回答

4

BestFragments依賴於你所使用的分析儀進行標記化。如果您必須分析如此大的文本,則最好在索引時存儲術語向量WITH_POSITIONS_OFFSETS

請仔細閱讀thisthis book

通過這樣做,你就不會需要分析在運行時的所有文字,你可以拿起重用現有項向量的方法,這將減少高亮時間。

+0

非常有趣。我要研究這個。 –

+0

有問題的代碼已經有位置和偏移。它應該是別的嗎? @ AR1 – Heidar