2009-05-08 3 views
4

Bin ein Neuling Lucene Suche API. Ich bekomme immer folgende Ausnahme, wenn ich den Lucene-Index aktualisiere ... Warum bekomme ich diesen Fehler und wie vermeide ich ihn?Ausnahme beim Aktualisieren von Lucene Index

System.IO.IOException: Lock obtain timed out: [email protected]:\Indexes\write.lock 
    at Lucene.Net.Store.Lock.Obtain(Int64 lockWaitTimeout) 
    at Lucene.Net.Index.IndexWriter.Init(Directory d, Analyzer a, Boolean create, Boolean closeDir) 
    at Lucene.Net.Index.IndexWriter.Init(String path, Analyzer a, Boolean create) 
    at Lucene.Net.Index.IndexWriter..ctor(String path, Analyzer a, Boolean create) 

Danke fürs Lesen.

Antwort

11

Lucene erstellt eine Sperrdatei, wenn der Index im Schreibmodus geöffnet wird. Diese Sperrdatei wird entfernt, wenn Sie den Index sauber schließen. Wenn Sie während des Schreibens des Index das Programm beenden, ohne den Lucene IndexWriter zu schließen, erhalten Sie diese Ausnahme beim nächsten Mal, wenn Sie versuchen, darauf zu schreiben. Wenn Sie die Sperrdatei aus dem Indexverzeichnis entfernen, wird diese Ausnahme nicht angezeigt.

Sie können das Sperren mit FSDirectory.setDisableLocks(false) deaktivieren, aber das ist nicht ratsam, da die Fehler stillschweigend ignoriert werden.

1

Ich denke, dass Sie diesen Fehler auch erhalten können, wenn ein Indexschreiben länger dauert als der Zeitüberschreitungswert und ein weiterer Index schreibt, nachdem die Sperre abgelaufen ist und bevor der Index beendet wird - zumindest schien es so zu sein.

Ich hatte das gleiche Problem, als ich anfing, ungefähr 50% der maximalen Anzahl von Dateien in einem einzigen Windows-Verzeichnis zu erreichen. Dies verlangsamte sich, um das Problem zu verursachen. (Win2k3)

Ich glaube, dass Sie Lucene neu kompilieren können, um den Zeitüberschreitungswert zu ändern.

+0

Können Sie bitte diese Frage beantworten? http://stackoverflow.com/questions/899542/problem-using-same-instance-of-indexsearcher-for-multiple-requests –

0

Versuchen Sie Folgendes:

try 
{ 
    writer = new IndexWriter(directory, new StandardAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED); 
} 
catch (LockObtainFailedException ex) 
{ 
    DirectoryInfo indexDirInfo = new DirectoryInfo(directory); 
    FSDirectory indexFSDir = FSDirectory.Open(indexDirInfo, new Lucene.Net.Store.SimpleFSLockFactory(indexDirInfo)); 
    IndexWriter.Unlock(indexFSDir); 
    writer = new IndexWriter(directory, new StandardAnalyzer(), IndexWriter.MaxFieldLength.UNLIMITED); 
} 
+0

Können Sie zuerst diesen Code reparieren? Der DirectoryInfo-Konstruktor übernimmt das AzureDirectory-Objekt nicht im Konstruktor. –