2009-04-15 2 views
4

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); 

Antwort

3

Die neueste Version von Lucene.Net (2.1) sind offen Leser erscheint mit create = true, auch wenn es eine Öffnung Indexwriter zu unterstützen:

http://incubator.apache.org/lucene.net/docs/2.1/Lucene.Net.Index.IndexWriter.html

Frühere Versionen sind nicht klar, ob sie dies unterstützen oder nicht. Ich würde versuchen, 2.1 zu verwenden.

+0

Vielen Dank für die Beantwortung. Ich werde es ausprobieren und sehen, ob diese Version das tut, was versprochen wird. – Marcus