21

estoy usando Lucene.Net de indexación y búsqueda de documentos, y estoy usando el siguiente código para crear o abrir un índice si es que existe:¿Cómo identificar si existe un índice Lucene.Net en una carpeta?

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

... 

private bool IndexExists 
{ 
    get 
    { 
     return ?? 
    } 
} 

Ahora, ¿cómo se puede aplicar IndexExists de una manera sencilla? No necesito que se arroje ninguna excepción.

Respuesta

37

El método estático IndexReader.IndexExists (ruta de cadena) (o una de sus sobrecargas) parece bastante adecuado.

3

Puede utilizar el constructor que no toma un parámetro booleano. Eso abrirá un índice existente si hay uno allí o creará uno nuevo si no existe.

enlace de documentación de Java (lo mismo para 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 no tiene esta sobrecarga. – Marek

+1

¿Qué versión de Lucene.Net no tiene la sobrecarga? Está ahí en 2.4. –

+0

Estoy usando el Lucene "directo de Java". 'IndexWriter' en 4.10. + Solo tiene un constructor. Pero no entiendo cómo puede obtener lo que el interlocutor quería de su solución: averigüe si ya hay un índice allí. –

0

Trato de encontrar este anwser también sin éxito y aquí es cómo he utilizado en mi código:

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

+0

Inteligente ... y posiblemente la mejor manera actualmente (ver mi respuesta: 4.10. + Ha cambiado la especificación de 'DirectoryReader.indexExists()' desde 4.0. +). Pero, por supuesto, como estoy seguro de que sabe, su solución es muy vulnerable a los cambios de versión. ¡Cada nueva versión tendrá que ser revisada! –

4

En < 4.0 es IndexReader.indexExists(org.apache.lucene.store.Directory)

En> 4.0 es DirectoryReader.indexExists(org.apache.lucene.store.Directory)

0

¡Vaya!

Este es un Lucene "recto de Java", pero bien puede aplicarse a otras variedades.

En Lucene 4.0.0 del API para DirectoryReader.indexExists() dice

devuelve verdadero si existe un índice en el directorio especificado.

Pero en Lucene 4.10.2 del API para DirectoryReader.indexExists() dice

devuelve verdadero si el índice es probable que exista en el directorio especificado. Tenga en cuenta que si existe un índice dañado, o si un índice en el proceso de cometer

... sí, se rompe a mitad de la frase. NB He compilado mi Javadoc directamente desde la fuente, pero la misma frase inacabada se puede ver en la API en línea. No solo eso, sino que miré la API de Lucene 6.0.0, y es exactamente lo mismo.

La frase "ganancias" es, sin embargo:

cierto si existe un índice; falso de lo contrario

... pero actualmente creo que un directorio vacío a veces (?) devolverá true (de mi prueba unitaria). De todos modos, no confiaría en eso.

Si crea un IndexReader en un directorio vacío, parece que todos sus métodos volverán sin arrojar excepciones. Puede ir al indexReader.numDocs(), y esto devolverá 0, pero eso no prueba que no haya ningún índice allí, solo que no hay Document s. Dependiendo de sus requisitos, eso podría ser suficiente, por supuesto.

Del mismo modo, puede crear un IndexSearcher a partir de un IndexReader, y puede crear un IndexWriter. Ninguno de estos tendrá ningún problema aparente con un directorio vacío.

MEJOR SOLUCIÓN:

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

Esto aparece, por lo que yo puedo decir, son totalmente fiables.

Cuestiones relacionadas