2011-01-07 4 views
12

Ich bin neu bei Lucene.NET, aber ich verwende an open source tool für Sitecore CMS gebaut, die Lucene.NET verwendet, um viele Inhalte aus dem CMS zu indizieren. Ich habe gestern bestätigt, dass die aktuellen Indexdateien bei der Neuerstellung meiner Indizes sauber gelöscht werden, so dass alles, was auf den Index angewiesen ist, für ungefähr 30 bis 60 Sekunden keine Daten erhält (die Zeit für einen vollständigen Indexaufbau). Gibt es eine Best Practice oder einen Weg, Lucene.NET zu veranlassen, die aktuellen Indexdateien nicht zu überschreiben, bis der neue Index vollständig neu erstellt wurde? Ich denke im Grunde, dass ich möchte, dass es in neue Temp-Index-Dateien schreibt, und wenn die Wiederherstellung abgeschlossen ist, überschreiben diese Dateien den aktuellen Index.Vermeiden Sie die Entfernung des aktuellen Lucene.NET-Index während der Neuerstellung

Beispiel von dem, was ich spreche:

  • Bauen frisch Index (~ 30 Sekunden)
  • Index über 500 Dokumente hat
  • Verwenden Codedaten in Index und Anzeige auf der Webseite zuzugreifen
  • Rebuild Index (~ 30 Sekunden)
    • Jeder Code, der Index für Daten liest nun gibt nichts zurück, weil die Indexdateien zu sein overwritte sind n; zeigt Ergebnisse in Website keine Daten
  • Rebuild komplett: wieder Daten nun Daten verfügbar,
auf der Webseite zurück

Vielen Dank im Voraus

+1

Sie können einen Index im Append-Modus öffnen. In diesem Fall bleibt Ihr aktueller Index verfügbar, bis Sie Ihre neuen Schreibvorgänge leeren oder festschreiben. – Mikos

Antwort

6

ich keine Erfahrung mit „Sitecores“ selbst haben, aber hier ist mein Geschichte.

Wir haben kürzlich die indexbasierte Suche (unter Verwendung von Lucene.Net) für unser eCommerce-Subsystem integriert. Der Index-Update-Prozess für unseren Fall könnte etwa eine halbe Stunde dauern (~ 50.000 Produkte selbst + viele damit zusammenhängende Informationen). Um eine "Denial-of-Service" -Antwort während der Aktualisierung des Indexes zu vermeiden, erstellen wir zunächst eine "backup" -Version des it (einfaches Kopieren des Indexverzeichnisses an einen anderen Ort) und alle weiteren Anfragen werden umgeleitet, um diese "backup" -Version zu verwenden. Wenn die Indexaktualisierung abgeschlossen ist, löschen wir die Sicherung, damit Clients die aktualisierte (oder "Live") Version des Indexes verwenden können. Dies hilft auch im Falle von unbehandelten Ausnahmen, die während des Update-Prozesses auftreten können, weil Sie in einem Fall ohne Index sein könnten (und in unserem Fall können Clients immer die "Backup" -Version verwenden).

Die API reference (Lucene 2.4) der Lucene.Net.Index.IndexWriter Objekt besagt Folgendes:

Beachten Sie, dass Sie einen Index mit öffnen kann create=true auch während Leser sind den Index. Die alten Leser werden weiter suchen den "Zeitpunkt" Snapshot sie hatten geöffnet, und wird nicht den neu erstellten Index sehen, bis sie wieder öffnen.

Sie sollten sich also zumindest keine Gedanken über die Clients machen, die derzeit in Ihrem Index suchen.

Ich hoffe, dies wird Ihnen helfen, eine richtige Entscheidung zu treffen.

1

Ich bin nicht vertraut mit dieser Sitecore-Tool, aber ich kann beantworten, wie Sie es mit reinem Lucene tun würde.Net: Sie sollten ein NRT Setup verwenden, was bedeutet "einen Indexersteller haben und nie schließen."

Im Grunde haben Index-Writer einen "virtuellen" Index im Speicher, bis er auf die Festplatte geleert wird. Solange Sie Ihre Leser vom Schreiber bekommen, werden Sie immer die neuesten Sachen sehen, auch wenn sie noch nicht auf die Festplatte geleert wurden.