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.

È stato utile?

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 DirectoryReader.indexExists() dice

  

Restituisce vero se esiste un indice nella directory specificata.

Ma in Lucene 4.10.2 l'API per true dice

  

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à IndexReader (dal mio test unitario). Comunque, non mi fiderei.

Se si crea un 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.

Allo stesso modo, puoi creare un IndexWriter da tale <=> e puoi creare un <=>. Nessuno di questi avrà alcun apparente problema con una directory vuota.

MIGLIORE SOLUZIONE:

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

Questo, per quanto posso dire, sembra essere affidabile.

scroll top