21

J'utilise Lucene.Net pour l'indexation et la recherche de documents, et je suis en utilisant le code suivant pour créer ou ouvrir un index si l'on existe:Comment identifier si un index Lucene.Net existe dans un dossier?

IndexWriter writer = new IndexWriter(@"C:\index", new StandardAnalyzer(), !IndexExists); 

... 

private bool IndexExists 
{ 
    get 
    { 
     return ?? 
    } 
} 

Maintenant, comment peut mettre en œuvre IndexExists de manière simple? Je n'ai besoin d'aucune exception pour être jeté.

Répondre

37

La méthode statique IndexReader.IndexExists (chemin de chaîne) (ou l'une de ses surcharges) semble plutôt appropriée.

3

Vous pouvez simplement utiliser le constructeur qui ne prend pas de paramètre booléen. Cela ouvrira un index existant s'il y en a un ou en créera un nouveau s'il n'existe pas.

lien de documentation Java (même pour Lucene.Net): http://lucene.apache.org/java/2_3_1/api/org/apache/lucene/index/IndexWriter.html#IndexWriter(org.apache.lucene.store.Directory, org.apache.lucene.analysis.Analyzer)

+0

Lucene.net n'a pas cette surcharge. – Marek

+1

Quelle version de Lucene.Net manque la surcharge? C'est là en 2.4. –

+0

J'utilise le "straight Java" Lucene. 'IndexWriter' dans 4.10. + N'a qu'un seul constructeur. Mais je ne comprends pas comment vous pouvez obtenir ce que le questionneur voulait de votre solution: savoir s'il existe déjà un index. –

0

J'essaie de trouver ce anwser aussi sans succès et voici comment je dans mon code:

private bool IndexExists { get { Renvoie IndexDirectory.FileExists ("segments.gen"); } }

+0

Clever ... et peut-être le meilleur moyen actuellement (voir ma réponse: 4.10. + A changé la spécification de 'DirectoryReader.indexExists()' depuis 4.0. +). Mais bien sûr, comme vous le savez sans doute, votre solution est très vulnérable aux changements de version. Chaque nouvelle version devra être vérifiée! –

4

Dans < 4.0 est IndexReader.indexExists(org.apache.lucene.store.Directory)

In> 4.0 est DirectoryReader.indexExists(org.apache.lucene.store.Directory)

0

Oups!

Ceci est le "droit Java" Lucene, mais il peut très bien s'appliquer à d'autres variétés.

Dans Lucene 4.0.0 l'API pour DirectoryReader.indexExists() dit

Renvoie true si un index existe dans le répertoire spécifié.

Mais dans Lucene 4.10.2 l'API pour DirectoryReader.indexExists() dit

Renvoie true si un index existe probablement dans le répertoire spécifié. Notez que si un index existe corrompu, ou si un indice dans le processus de commettre

... oui, il se brise la mi-peine. NB J'ai compilé mon Javadoc directement à partir de la source, mais la même phrase inachevée peut être vue dans l'API en ligne. Non seulement cela, mais j'ai regardé l'API Lucene 6.0.0, et c'est exactement la même chose.

Le terme "revenus" phrase est cependant:

true si un index existe; false sinon

... mais je crois actuellement qu'un répertoire vide retournera parfois (?) true (à partir de mes tests unitaires). De toute façon, je ne le ferais pas confiance.

Si vous créez un IndexReader sur un répertoire vide, il semble que toutes ses méthodes retourneront sans lancer des exceptions. Vous pouvez aller indexReader.numDocs(), et cela retournera 0, mais cela ne prouve pas qu'il n'y a pas d'index là-bas, seulement qu'il n'y a pas Document s. En fonction de vos besoins, cela pourrait être suffisant, bien sûr.

De même, vous pouvez créer un IndexSearcher à partir d'un tel IndexReader, et vous pouvez créer un IndexWriter. Aucun d'entre eux n'aura de problème apparent avec un répertoire vide.

meilleure solution:

try { 
     directoryReader = DirectoryReader.open(fsDir); 
    } catch (org.apache.lucene.index.IndexNotFoundException e) { 
     ... 
    } 

Cela semble, pour autant que je peux dire, pour être fiable.

Questions connexes