2009-04-15 8 views
4

J'ai appris en lisant la documentation disponible qu'une instance IndexSearcher doit être partagée entre les recherches, pour des performances optimales, et qu'une nouvelle instance doit être créée pour charger toutes les modifications apportées à l'index. Cela implique que l'index est accessible en écriture (en utilisant IndexWriter) après avoir créé une instance de IndexSearcher qui pointe vers le même répertoire. Cependant, ce n'est pas le comportement que je vois dans mon implémentation de Lucene.Net. J'utilise FSDirectory. RAMDirectory n'est pas une option viable. IndexSearcher verrouille l'un des fichiers d'index (dans mon implémentation c'est le fichier _1.cfs) rendant l'index non-modifiable pendant la durée de vie de l'instance IndexSearcher.Lucene IndexSearcher verrouille l'index causant IOException lors de la reconstruction

Est-ce un comportement connu? Je ne peux pas reconstruire l'index à partir de zéro en utilisant une instance IndexSearcher créée avant la reconstruction? Est-il seulement possible de modifier l'index, mais pas de le reconstruire?

Voici comment je crée l'instance IndexSearcher:

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

Voici comment je crée le IndexWriter:

var directory = FSDirectory.GetDirectory(storagePath, true); 
var indexWriter = new IndexWriter(directory, new StandardAnalyzer(), true); 

J'utilise la version 2.0 Lucene.Net.

Edit:

Mise à niveau vers Lucene.Net 2.1 (thx KENE) et de modifier légèrement la façon dont je crée mon IndexWriter a résolu le problème:

var directory = FSDirectory.GetDirectory(storagePath, false); 
var indexWriter = new IndexWriter(directory, new StandardAnalyzer(), true); 

Répondre

3

La dernière version de Lucene.Net (2.1) semble soutenir l'ouverture d'un IndexWriter avec create = true, même quand il y a des lecteurs ouverts:

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

Les versions antérieures sont pas clair quant à savoir s'ils soutiennent cela ou non. J'essaierais d'utiliser 2.1.

+0

Merci beaucoup pour répondre. Je vais essayer et voir si cette version fait ce qui est promis. – Marcus

Questions connexes