2014-02-10 6 views
9

Lucene (4.6) Textmarker hat sehr langsame Leistung, wenn ein häufiger Begriff gesucht wird. Die Suche ist schnell (100ms), aber die Hervorhebung kann mehr als eine Stunde (!) Dauern.sehr langsam Highlight Leistung in Lucene

Details: großer Textkorpus wurde verwendet (1,5 GB Klartext). Die Leistung hängt nicht davon ab, ob der Text in kleinere Teile aufgeteilt wird oder nicht. (Getestet mit 500MB und 5MB Teilen.) Positionen und Offsets werden gespeichert. Wenn ein sehr häufiger Begriff oder Muster gesucht wird, wird TopDocs schnell abgerufen (100 ms), aber jede „searcher.doc (id)“ Anrufe sind teuer (5-50s) und getBestFragments() ist extrem teuer (mehr als 1 Stunde). Auch sie werden zu diesem Zweck gespeichert und indiziert. (Hardware: Core i7, 8GM mem)

länger Hintergrund: wäre es eine Sprachanalyse Forschung dienen. Ein spezielles Stemming wird verwendet: es speichert auch den Teil der Sprachinformation. Zum Beispiel, wenn "adj adj adjus adj Substantiv" gesucht wird, gibt es alle seine Vorkommen im Text mit Kontext.

Kann ich tune seine Leistung, oder sollte ich ein anderes Werkzeug wählen?

Gebrauchte Code:

  //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); 

Verwandte (offen) Frage: https://stackoverflow.com/questions/19416804/very-slow-solr-performance-when-highlighting

Antwort

4

BestFragments beruht auf der tokenization vom Analysator durchgeführt, die Sie verwenden. Wenn Sie so einen großen Text zu analysieren haben, sollten Sie besser Begriff Vektor WITH_POSITIONS_OFFSETS während der Indexierung zu speichern.

Bitte lesen Sie this und this book

Dadurch, dass Sie nicht den gesamten Text zur Laufzeit analysieren müssen, wie Sie eine Methode abholen können die bestehenden Begriff Vektor zur Wiederverwendung und das wird die Hervorhebung Zeit reduzieren .

+0

Sehr interessant. Ich werde das untersuchen. –

+0

Der betreffende Code ist bereits mit Positionen und Offsets. Sollte es etwas anderes sein? @ AR1 – Heidar