Beim Lesen der verfügbaren Dokumentation habe ich gelernt, dass eine IndexSearcher-Instanz für eine optimale Leistung für alle freigegeben werden soll und dass eine neue Instanz erstellt werden muss, um die vorgenommenen Änderungen zu laden Der Index. Dies bedeutet, dass der Index beschreibbar ist (mit IndexWriter), nachdem er eine Instanz von IndexSearcher erstellt hat, die auf dasselbe Verzeichnis verweist. Dies ist jedoch nicht das Verhalten, das ich in meiner Implementierung von Lucene.Net sehe. Ich benutze FSDirectory. RAMDirectory ist keine praktikable Option. Der IndexSearcher sperrt eine der Indexdateien (in meiner Implementierung ist es die _1.cfs-Datei), wodurch der Index während der Lebensdauer der IndexSearcher-Instanz nicht aktualisierbar ist.Lucene IndexSearcher sperrt den Index und verursacht IOException bei der Neuerstellung
Ist das ein bekanntes Verhalten? Kann ich den Index nicht von Grund auf neu erstellen, während ich eine IndexSearcher-Instanz verwende, die vor der Neuerstellung erstellt wurde? Ist es nur möglich, den Index zu modifizieren, aber nicht neu aufzubauen?
Hier ist, wie ich die IndexSearcher Instanz erstellen:
// Create FSDirectory
var directory = FSDirectory.GetDirectory(storagePath, false);
// Create IndexReader
var reader = IndexReader.Open(directory);
// I get the same behaviour regardless of whether I close the directory or not.
directory.Close();
// Create IndexSearcher
var searcher = new IndexSearcher(reader);
// Closing the reader will cause "object reference not set..." when searching.
//reader.Close();
Hier ist, wie ich die Indexwriter erstellen:
var directory = FSDirectory.GetDirectory(storagePath, true);
var indexWriter = new IndexWriter(directory, new StandardAnalyzer(), true);
I Lucene.Net Version 2.0 bin mit.
Edit:
Upgrade auf Lucene.Net 2.1 (thx KENE) und Modifizieren leicht den Weg Ich eröffne mein Indexwriter das Problem behoben:
var directory = FSDirectory.GetDirectory(storagePath, false);
var indexWriter = new IndexWriter(directory, new StandardAnalyzer(), true);
Vielen Dank für die Beantwortung. Ich werde es ausprobieren und sehen, ob diese Version das tut, was versprochen wird. – Marcus