2010-01-20 6 views
5

Zusammenfassung: Ich sammle die Doc-IDs aller Treffer für eine bestimmte Suche mit einem benutzerdefinierten Collector (es füllt ein BitSet mit den IDs). Die Such- und Suchdocs sind ziemlich schnell entsprechend meinen Bedürfnissen, aber wenn es darum geht, die Dokumente tatsächlich von der Festplatte zu holen, werden die Dinge sehr langsam. Gibt es eine Möglichkeit, Lucene für eine schnellere Dokumentensammlung zu optimieren?Alle Treffer für eine Suche in Lucene sammeln/

Details: Ich arbeite an einem verarbeiteten Korpus von Wikipedia und ich behalte jeden Satz als separates Dokument. Wenn ich nach "Computer" suche, bekomme ich alle Sätze, die den Begriff Computer enthalten. Momentan funktioniert das Durchsuchen des Korpus und das Abrufen aller Dokument-IDs in weniger als einer Sekunde, aber das Abrufen der ersten 1000 Dokumente dauert ungefähr 20 Sekunden. Das Abrufen aller Dokumente dauert proportional mehr Zeit (d. H. Weitere 20 Sekunden für jede 1.000-Dokumenten-Stapelverarbeitung).

Nachfolgende Suchen und das Abrufen von Dokumenten benötigen viel weniger Zeit (obwohl ich nicht weiß, wer Caching, OS oder Lucene durchführt?), Aber ich werde nach vielen verschiedenen Begriffen suchen, auf die ich mich nicht verlassen möchte Caching, die Performance bei der allerersten Suche ist für mich entscheidend.

Ich bin auf der Suche nach Vorschlägen/Tricks, die die Leistung beim Abrufen von Dokumenten verbessern (wenn es überhaupt möglich ist). Danke im Voraus!

Nachtrag:

verwende ich Lucene 3.0.0 aber ich benutze Jython Lucene Klassen zu fahren. Was bedeutet, ich für jeden DokuID der get_doc Methode der folgenden Jython-Klasse aufrufen ich bei der Suche abgerufen:

class DocumentFetcher(): 
    def __init__(self, index_name): 
    self._directory = FSDirectory.open(java.io.File(index_name)) 
    self._index_reader = IndexReader.open(self._directory, True) 
    def get_doc(self, doc_id): 
    return self._index_reader.document(doc_id) 

Ich habe 50M Dokumente in meinem Index.

+0

Ich habe mit dieser Größe der Daten gearbeitet, aber nicht mit diesen vielen (50M) Dokumenten. 20ms ist eine "gute" Antwortzeit, wenn Sie nur wenige Dutzend Dokumente abrufen, was ein typischer Fall ist. In diesem Fall, da Sie riesige Daten abrufen möchten, fühlt es sich zu langsam an. Wenn Sie eine wesentlich bessere Leistung wünschen, müssen Sie vermutlich eine Menge Speicher verwenden. –

+0

Ich nehme an, ein Speicher-Geschwindigkeit-Trade-Off würde eine Art Vorwärmen von Lucene beinhalten (um einen signifikanten Teil der Dokumente in den Speicher zu laden, bevor die Such- und Abrufoperationen ausgeführt werden. Hmm, vielleicht kann ich die Dokumente in einer externen DB behalten und hoffe, dass DB die Caching-Probleme besser als meine benutzerdefinierte Lösung verwaltet –

+0

Sie können einen Dummy-Aufruf an FieldCache.DEFAULT vornehmen.getStrings(), die alle Werte für dieses Feld laden. Wenn dieser Aufruf OOME überlebt, sollten Sie Leistungsgewinne mit der Lösung sehen, die ich zuvor gegeben habe. –

Antwort

2

Sie speichern wahrscheinlich viele Informationen im Dokument. Reduziere die gespeicherten Felder auf soviel wie du kannst.

Zweitens, beim Abrufen von Feldern, wählen Sie nur die Felder, die Sie benötigen. Sie können die folgende Methode von IndexReader verwenden, um nur wenige der gespeicherten Felder anzugeben.

public abstract Document document(int n, FieldSelector fieldSelector) 

Auf diese Weise laden Sie keine Felder, die nicht verwendet werden.

Sie können das folgende Codebeispiel verwenden.

+0

Danke für den Vorschlag und das Codebeispiel. Ich wusste nichts von FieldSelector, das könnte in Zukunft nützlich sein. Aber ich speichere nur ein Feld im Dokument und das muss ich am Ende holen. Das einzige Feld, das ich speichere, ist nur der Satz selbst und ein paar Grammatikanmerkungen. Das heißt, für ein einzelnes Dokument (d. H. Satz) speichere ich nicht mehr als 300-400 Bytes. (Zusätzliche Informationen: Ich habe rund 50 Mio. Dokumente indiziert) –

1

Scaling Lucene and Solr diskutiert viele Möglichkeiten zur Verbesserung der Lucene-Leistung. Da Sie gerade an der Lucene-Suche innerhalb von Wikipedia arbeiten, könnten Sie auch Interesse an Rainman'sLucene Search of Wikipedia haben. Er diskutiert hauptsächlich Algorithmen und weniger Leistung, aber dies kann immer noch relevant sein.