Come identificare se esiste un indice Lucene.Net in una cartella?
-
05-07-2019 - |
Domanda
Sto usando Lucene.Net per indicizzare e cercare documenti e sto usando il seguente codice per creare o aprire un indice se ne esiste uno:
IndexWriter writer = new IndexWriter(@"C:\index", new StandardAnalyzer(), !IndexExists);
...
private bool IndexExists
{
get
{
return ??
}
}
Ora, come si può implementare IndexExists
in modo semplice? Non ho bisogno di eccezioni da lanciare.
Soluzione
Il metodo statico IndexReader.IndexExists (percorso stringa) (o uno dei suoi sovraccarichi) sembra abbastanza adatto.
Altri suggerimenti
In < 4.0 è IndexReader.indexExists(org.apache.lucene.store.Directory)
In > 4.0 è DirectoryReader.indexExists(org.apache.lucene.store.Directory)
Potresti semplicemente usare il costruttore che non accetta un parametro booleano. Questo aprirà un indice esistente se ce n'è uno lì o ne creerà uno nuovo se non esiste.
Link alla documentazione Java (lo stesso per 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)
Cerco di trovare anche questa risposta senza successo ed ecco come ho usato nel mio codice:
IndexExists bool privato { ottenere { return IndexDirectory.FileExists (" segment.gen "); } }
So che questa è una vecchia voce, ma ciò che Sean Carpenter ha pubblicato è assolutamente giusto e questo costruttore esiste anche nell'ultima versione di Lucene .NET. La documentazione per la classe IndexWriter è disponibile qui:
Ops! Questo è " straight Java " Lucene, ma potrebbe applicarsi anche ad altre varietà. In Lucene 4.0.0 l'API per Restituisce vero se esiste un indice nella directory specificata. Ma in Lucene 4.10.2 l'API per Restituisce vero se esiste probabilmente un indice nella directory specificata.
Si noti che se esiste un indice corrotto o se è in corso un indice di
commettere ... sì, si interrompe a metà frase. NB: ho compilato il mio Javadoc direttamente dalla fonte, ma la stessa frase incompleta può essere vista nell'API online. Non solo, ma ho guardato l'API Lucene 6.0.0, ed è esattamente la stessa. Il " restituisce " la frase è tuttavia: vero se esiste un indice; falso altrimenti ... ma al momento credo che una directory vuota a volte (?) restituirà Se si crea un Allo stesso modo, puoi creare un MIGLIORE SOLUZIONE: Questo, per quanto posso dire, sembra essere affidabile. DirectoryReader.indexExists()
dice
true
dice
IndexReader
(dal mio test unitario). Comunque, non mi fiderei. indexReader.numDocs()
su una directory vuota, sembra che tutti i suoi metodi torneranno senza generare eccezioni. Puoi andare Document
e questo restituirà 0, ma ciò non prova che non ci sia indice lì, solo che non ci sono IndexSearcher
s. A seconda delle tue esigenze potrebbe essere sufficiente, ovviamente. IndexWriter
da tale <=> e puoi creare un <=>. Nessuno di questi avrà alcun apparente problema con una directory vuota. try {
directoryReader = DirectoryReader.open( fsDir );
} catch ( org.apache.lucene.index.IndexNotFoundException e) {
...
}