2009-02-02 6 views
5

Ich habe Lucene.net verwendet, um die Suchfunktionalität (sowohl für Datenbankinhalte als auch für hochgeladene Dokumente) auf mehreren kleinen Websites ohne Probleme zu implementieren. Jetzt habe ich eine Seite, auf der ich mehr als 5000 Dokumente (hauptsächlich PDFs) indexiere und die Abfrage wird ein bisschen langsam.Caching Lucene.net Suchergebnisse

Ich nehme an, der beste Weg, um es zu beschleunigen wäre, Caching einer Art zu implementieren. Kann mir jemand irgendwelche Hinweise/Beispiele geben, wo ich anfangen soll? Wenn Sie neben dem Caching auch noch andere Vorschläge haben (z. B. wenn ich mehrere Indizes verwende), würde ich das gerne auch hören.

Edit:

Dumb Benutzerfehler verantwortlich für die langsamen Abfragen. Ich habe Highlights für das gesamte Ergebnis auf einmal erstellt, anstatt nur die Seite, die ich angezeigt habe. Hoppla.

Antwort

5

Ich werde hier eine große Annahme machen und nehme an, Sie hängen nicht an Ihren Indexsuchenden dazwischen Aufrufe, um den Index abzufragen.

Wenn das stimmt, sollten Sie auf jeden Fall Index-Sucher für alle Abfragen an Ihren Index freigeben. Wenn der Index größer wird (und er muss nicht wirklich groß werden, damit dies ein Faktor wird), wird der Wiederaufbau des Indexsuchers mehr und mehr zu einem Overhead. Damit dies richtig funktioniert, müssen Sie den Zugriff auf die Abfrageparserklasse synchronisieren (es ist nicht threadsicher).

BTW, die Java-Dokumente sind (wie ich gefunden habe) genauso für die .net-Version anwendbar.

Für weitere Informationen über Ihr Problem finden Sie hier: http://wiki.apache.org/lucene-java/ImproveSearchingSpeed

+0

Nice link, danke – Nick

+0

Keine probs. Funktioniert jetzt alles auf Ihrer Website? –

1

Lucene verwendet einen eigenen internen "Caching" -Mechanismus, um den Indexabruf zu einem schnellen Vorgang zu machen. Ich denke nicht, dass Caching hier dein Problem ist.

Ein 5000-Index-Dokument klingt trivial in der Größe, aber das hängt weitgehend davon ab, wie Sie Ihren Index erstellen, was Sie indexieren/speichern, wie Sie (operativ) abfragen, Dokumentgröße usw.

Bitte füllen Sie die Lücken mit so vielen Informationen wie möglich über Ihren Index.

1

Zuerst Lucene selbst unterstützt eine In-Memory-Version von Verzeichnissen:

Lucene.Net.Store.RAMDirectory 

Sie können es gerne verwenden:

RAMDirectory idx = new RAMDirectory(); 

// Make an writer to create the index 
IndexWriter writer = 
    new IndexWriter(idx, new StandardAnalyzer(), true); 

Wenn dies für Sie funktioniert, aber es ist zu viel RAM verwendet wird, schreibe einen Wrapper und stelle ihn als Interface oder Webservice zur Verfügung. Oder, wenn Sie nur das, was Sie abfragen wollen, cachen, um zu kontrollieren, wenn Entitäten den Cache verlassen, können Sie einen Wrapper um Lucene schreiben, der die häufigsten Ergebnisse basierend auf den Schlüsselwörtern für Sie speichert.

Ich bevorzuge die oben genannten. Erstellen Sie einen Webservice oder ein Service-Projekt, das den Lucene-Speicher mit RAMDirectory umschließt. Auf diese Weise können Sie den Webservice auf einen anderen Server mit vielen RAMs verlagern, wenn der Index riesig ist - und nahezu sofortige Ergebnisse haben.

1

Seien Sie sicher, dass Ihre Indizes zu optimieren.

Auch dies ist eine schnelle/einfache/effektive Möglichkeit, Caching zu implementieren: HttpRuntime.Cache.Add (...);

Sie können den ASP.Net-Cache von jeder Art von Projekt/Bibliothek verwenden.